Heroku控制台奇怪的日期问题

时间:2011-08-26 08:11:41

标签: ruby ruby-on-rails-3 heroku

我有一个使用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提供相同的结果。是由于时区还是其他某些设置?

由于

3 个答案:

答案 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);
    }