【问题标题】:Heroku console weird date issueHeroku 控制台奇怪的日期问题
【发布时间】:2011-11-04 07:57:20
【问题描述】:

我有一个每天运行一次的 cron 任务,使用 Heroku 的 Daily 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 提供相同结果的任何想法。是因为时区还是其他某些设置?

谢谢

【问题讨论】:

  • 对我来说听起来像是一个错误,但您可以通过 heroku config:add TZ=Europe/Berlin 设置 heroku 的时区

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


【解决方案1】:

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

【讨论】:

  • hmm..似乎是问题..所以,Date.yesterday 是 Time.now.in_time_zone - 1.day
【解决方案2】:

Date.Today 是 ruby​​ 提供的默认方法。 Date.Yesterday 虽然不是 ruby​​ 方法,但由 Rails 作为其核心扩展的一部分提供。

Date.Yesterday 返回Date.current.yesterday

从 Rails 文档中引用的 Date.Current,

在设置 Time.zone 或 config.time_zone 时返回 Time.zone.today, 否则只返回 Date.today

这似乎是您在两种方法中获得相同日期的原因。

【讨论】:

  • 您与上述示例中没有设置时区的第一种情况相矛盾。 Date.current 不能是 Date.today,因为 Date.yesterday 显示为 Wed 而不是 Thu。那么,第一种情况是设置时区的实例吗?我猜时区是设置的,否则它应该为零。只有这样两个答案——你的答案和 Abhaya 的答案相互支持。无论如何,谢谢。
【解决方案3】:

很可能是时区问题。

我正在使用 Spring Boot 进行开发,我在主类中使用以下代码:

@PostConstruct
    public void init() {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    }

当生成 Date、LocalDate、LocalDateTime 或 Instant 使用时:

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

【讨论】:

  • Java 与 8 年前的 Ruby on Rails 3 问题并不真正相关。问题在于不了解显示的时区内容/未使用正确的时区感知功能(服务器时区可能与应用程序配置的时区不同)。
猜你喜欢
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多