0

'因为大写,它们是常量。

我在学习 ruby​​ 的 Date 助手时很开心。

1.9.3p125 :057 > Date::ABBR_MONTHNAMES
 => [nil, "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 
1.9.3p125 :058 > Date::ABBR_DAYNAMES
 => ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] 
1.9.3p125 :059 > Date::MONTHNAMES
 => [nil, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] 
1.9.3p125 :060 > Date::DAYNAMES
 => ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] 
1.9.3p125 :070 > Date::MONTHNAMES[Time.new.month]
=> "August" 

好玩的东西!但是 GREGORIAN、JULIAN、ENGLAND 和 ITALY (!) 常量呢?它们有什么用/我如何使用它们?我可以输出:

1.9.3p125 :061 > Date::GREGORIAN
 => -Infinity 
1.9.3p125 :062 > Date::JULIAN
 => Infinity 
1.9.3p125 :063 > Date::ENGLAND
 => 2361222 

或者

1.9.3p125 :067 > Date.new
 => #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)> 
1.9.3p125 :068 > Date.new.new_start(Date::JULIAN)
 => #<Date: -4712-01-01 ((0j,0s,0n),+0s,Infj)> 
1.9.3p125 :069 > Date.new.new_start(Date::ENGLAND)
 => #<Date: -4712-01-01 ((0j,0s,0n),+0s,2361222j)> 

从下面看起来,朱利安是一个差了几天的日历。我记得几个世纪前了解了日历重置,所以这是有道理的,但是英格兰和意大利以及它们将如何使用对我来说仍然不清楚。

1.9.3p125 :076 > Date.new(1977,7,1).new_start(Date::ENGLAND)
 => #<Date: 1977-07-01 ((2443326j,0s,0n),+0s,2361222j)> 
1.9.3p125 :077 > Date.new(1977,7,1).new_start(Date::ITALY)
 => #<Date: 1977-07-01 ((2443326j,0s,0n),+0s,2299161j)> 
1.9.3p125 :078 > Date.new(1977,7,1).new_start(Date::JULIAN)
 => #<Date: 1977-06-18 ((2443326j,0s,0n),+0s,Infj)> 
4

3 回答 3

1

在西方世界,通常使用年、月和日来表示日期。如果我们日历的定义在过去没有改变,这将是表达历史上任何一天的完美方式。

我们今天所知道的日历是由 Julius Cesar 引入的,因此被称为儒略历。不幸的是,它有一个小缺陷:儒略历使用每四年闰年的概念来弥补一年不是正好有 365 天而是大约 365.25 天这一事实。然而这并不完全正确。一年实际上要短一些,如果你每四年添加一个闰年,这个错误将累积数百年,迟早你会失去一整天。

今天我们每四年有一个闰年,但如果一年可以被 100 整除,除非它也可以被 1000 整除,否则闰年不会。这样做大约是一年 365.2425 天。改革被称为格里高利历,是由教皇格里高利十三世提出的。更复杂的是,公历并不是同时在每个国家推出的。如果没有这个开关,儒略历到今天已经关闭了 13 天。

在 Ruby 中创建 Date 对象时,可以使用以下四个常量之一:

Date.new(2019, 6, 29, Date::ITALY)
Date.new(2019, 6, 29, Date::ENGLAND)
Date.new(2019, 6, 29, Date::GREGORIAN)
Date.new(2019, 6, 29, Date::JULIAN)

如果您使用Date::ITALY(如果您根本没有指定任何内容,这是默认设置),则 1582-10-15 之前的日期将被解释为儒略历的日期,所有其他日期都被解释为公历的日期。1582-10-15 是意大利引入公历的日期。

如果使用Date::ENGLAND,则 1752-09-14 之前的日期被解释为儒略历的日期,所有其他日期被解释为公历的日期。1752-09-14 是大英帝国以及美洲殖民地引入公历的日期。

如果使用Date::GREGORIAN,则 Date 对象的行为就像公历一直存在,无论是哪个日期。所有日期,甚至改革之前的日期都被解释为公历日期。

如果您使用Date::JULIAN,则 Date 对象将表现得好像此日期重组从未存在过一样。所有日期均根据儒略历进行解释。

什么是正确的值?好吧,没有。如果您不想处理历史日期,则除此之外的任何值Date::JULIAN都可以。如果您需要处理历史日期,您需要知道这些日期指的是哪个日历。

最后,除了传递这些常量之一,您还可以传递一个整数值,该整数值被解释为切换到公历的儒略日数。这很有用,因为某些国家/地区在不同的日期切换,没有任何可用的常数表示。

于 2019-06-29T02:30:41.133 回答
0

您可以进入 ext/date/date_core.c 并获取那里的值。它们是常量,是的,但您问如何使用它们。你的问题应该是如何提取它们。给定用于创建所需时间和日期的数据,用于计算 Date 和 DateTime 对象。

例如,这将是一个具有特定值的元素。

#<DateTime: 2017-01-06T12:05:55+00:00 ((2457760j,43555s,553855002n),+0s,2299161j)>

注意到所有的部分了吗?其中两个在数字后有 j。计算这些是这些常量的用途,并且是类对象的一部分。有许多使用它们的方法和许多类型。一个很好的阅读是维基百科上的朱利安日。查看所有这些不同值的表格。历史也很有趣,因为它们与迈克尔提到的内容有关。

至于您为其中两个返回的值,请注意它们也是类。这也很奇怪,因为这与您的系统可以在时间上向前或向后多远处理数字有关。

无穷

于 2017-01-04T01:44:42.240 回答
-1

所有常量都在文档中进行了解释。根据经验,如果以下解释对您没有任何意义,您可能根本不需要担心这些常量。

ENGLAND 英格兰及其殖民地历法改革日的儒略日编号。

GREGORIAN 公历改革日期的儒略日数

ITALY 意大利和一些天主教国家历法改革日的儒略日编号。

JULIAN 预测儒略历的历法改革日期的儒略日数

以下是有关不同日历系统的更多信息:

于 2012-08-06T21:04:14.277 回答