如何在 Smalltalk (Pharo / Squeak) 中为 Date 或 DataAndTime 对象设置年月日值

How to set day month and year values for a Date or DataAndTime object in Smalltalk (Pharo / Squeak)

我正在尝试为 Class 日期或 Class DateAndTime 的对象找到一个预定义的方法,它允许我通过提供三个来创建一个新的日期(或一个新的 DateAndTime)整数:一个整数代表一个月中的第几天 (1-31);一个月 (1 - 12);以及代表年份的四位整数。

(目前我找到的最接近的是 Integer>>asYear )

有没有一种方法可以一次设置所有三个参数?

如果我对你的理解是正确的,你正试图从代表上述日期的 daymonthyear 的三个整数创建 Date 的实例。

当遇到这样的问题时,您可以浏览 class、Date(在本例中),并检查其协议中的 instance creation 方法。在 Pharo 中,这个类别中有几种方法,但很容易看到(我认为)#year:month:day 看起来是一个很好的候选者。所以,你可以试试看。只需计算表达式

Date year: 2015 month: 12 day: 31

看看会发生什么(您可以检查或打印它以查看结果)。

您还会发现 #newDay:month:year 是另一个不错的候选人。你也可以试试。或者你可以看到它发送了我们之前的消息,因此它只是一个同义词(存在是为了与支持 Smalltalk-80/ANSI 规范的其他方言兼容)。

字符串>>asDate

允许将日期格式的字符串转换为日期

例如(在工作区中)

    aDateString := String new . " prints as '' "
    aDateString := '1984-11-03' . " prints as '1984-11-03' "
    aDate := Date new . " prints as 1 January 1901 "
    aDate := aDateString asDate . "prints as 3 November 1984"

String>>asDate 方法中的注释表明 "Many allowed forms, see Date>>#readFrom:"

日期>>readFrom: 说

"Read a Date from the stream in any of the forms:  
<day> <month> <year>        (15 April 1982; 15-APR-82; 15.4.82; 15APR82)  
<month> <day> <year>        (April 15, 1982; 4/15/82)
<year>-<month>-<day>        (1982-04-15) (ISO8601)"

也相关:String>>asDateAndTime

n.b。 DateAndTime 对象是一个精确的瞬间。

Date、Year、Month、Week 和 Schedule 都是 Class Timespan 的子类,因此它们都有开始时刻、持续时间和结束时刻。