我有一个使用Heroku的Daily Cron插件每天运行一次的cron任务。 cron从昨天的数据中获取值,并使用今天的时间戳创建所需的对象。但是,我面临着不寻常的情况。这是来自Heroku控制台:
>> Date.today
=> Thu, 25 Aug 2011
>> Date.yesterday
=> Thu, 25 Aug 2011
>> DateTime.now
=> Thu, 25 Aug 2011 23:31:42 -0700
当前时间是23:31,我想稍后试一试。这就是我现在所拥有的:
>> Date.today
=> Fri, 26 Aug 2011
>> Date.yesterday
=> Thu, 25 Aug 2011
>> DateTime.now
=> Fri, 26 Aug 2011 00:35:14 -0700
任何想法为什么Date.today和Date.yesterday提供相同的结果。是由于时区还是其他某些设置?
由于
答案 0 :(得分:3)
Date.today表示根据您的服务器时间的日期,与您设置的时区无关。
Date.yesterday是Time.now.in_time_zone - 1.day。这取决于我们设置的Time.zone
这个例子应该澄清一下:
ruby-1.9.2-p180 :014 > Time.now => 2011-08-26 03:21:10 +0545
ruby-1.9.2-p180 :015 > Time.zone => (GMT+00:00) UTC
ruby-1.9.2-p180 :016 > Time.now.in_time_zone => Thu, 25 Aug 2011 21:36:40 UTC +00:00
ruby-1.9.2-p180 :018 > Date.yesterday => Wed, 24 Aug 2011
ruby-1.9.2-p180 :017 > Date.today => Fri, 26 Aug 2011
现在,将时区设为加德满都之后。 Date.yesterday按预期更改,但Date.today没有更改
ruby-1.9.2-p180 :019 > Time.zone="Kathmandu" => "Kathmandu"
ruby-1.9.2-p180 :022 > Time.now.in_time_zone => Fri, 26 Aug 2011 03:55:28 NPT +05:45
ruby-1.9.2-p180 :020 > Date.yesterday=> Thu, 25 Aug 2011
ruby-1.9.2-p180 :021 > Date.today => Fri, 26 Aug 2011
答案 1 :(得分:2)
Date.Today是ruby提供的默认方法。 Date.Y yesterday虽然不是ruby方法,但是Rails作为其核心扩展的一部分提供。
Date.Y yesterday返回Date.current.yesterday
引用来自rails文档的Date.Current,
设置Time.zone或config.time_zone时返回Time.zone.today, 否则只返回Date.today
这似乎是您为这两种方法获得相同日期的原因。
答案 2 :(得分:0)
这可能是TimeZone的问题。
我正在Spring Boot中进行开发,并且正在主类中使用以下代码:
@PostConstruct
public void init() {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}
当生成日期,LocalDate,LocalDateTime或即时使用时:
public static Instant getInstantNow() {
Clock utcClock = Clock.systemUTC();
return Instant.now(utcClock).minusSeconds(10800);//my local comparing to UTC in seg.
}
public static LocalDateTime getLocalDateTimeNow() {
ZonedDateTime nowBrasil = ZonedDateTime.now(ZoneId.of("Brazil/East"));
return LocalDateTime.from(nowBrasil);
}
public static LocalDate getLocalDateNow() {
ZonedDateTime nowBrasil = ZonedDateTime.now(ZoneId.of("Brazil/East"));
return LocalDate.from(nowBrasil);
}