【问题标题】:Why does joda DateTimeZone's getOffset() method require an "instant"?为什么 joda DateTimeZone 的 getOffset() 方法需要“即时”?
【发布时间】:2013-03-14 18:51:57
【问题描述】:

我正在尝试做的事情:

从 DateTimeZone 对象,我试图以毫秒为单位获取 GMT 偏移量。示例:

DateTimeZone gmt= // somehow get gmt zone object
long offset = gmt.getOffsetSomehow(); // expect offset = 0

DateTimeZone ny_est = // somehow get that time zone object representing "EST" offset of NY zone
long offset = ny_est.getOffsetSomehow(); // expect offset = -18000000 = -5*60*60*1000

DateTimeZone hkt = // somehow get HK time zone object
long offset = hkt.getOffsetSomehow(); // expect offset = 28800000 = 8*60*60*1000

Joda 的 DateTimeZone 对象有一个名为getOffset 的方法,它接受一个参数。问题:

  1. 为什么那个方法需要一个参数?我原以为该方法不会期望任何参数,而只是按照我想要的虚构“getOffsetSomehow()”方法的方式行事。
  2. 如何在上面的 sn-p 中获取时区对象?
  3. 什么实际的代码方法/sn-p 可以让我得到我想要得到的“偏移”值?

【问题讨论】:

  • @jrharshanth 如果您提出问题;如果答案对您有用;你可以接受答案。
  • 我也很想知道这个问题的答案。我在我的应用程序的一部分中使用DateTimeZone.forOffsetMillis(...) 初始化并保存了一个 DateTimeZone,现在我想再次获取偏移量,以便我可以将 int 或 long 值保存在数据库中。推测 DateTimeZone 对象将偏移量存储在其实例字段之一中。没有明显的方法可以获取这些数据。

标签: java datetime timezone jodatime


【解决方案1】:

这是因为偏移量随时间而变化。一个例子是夏令时。另一个是决定移动到另一个时区的国家。

如果你想要当前的偏移量,现在就这样提交:

int offset = DateTimeZone.forID("Europe/Berlin").getOffset(new DateTime());
System.out.println(offset);

【讨论】:

  • getOffset() 方法是一个抽象方法,而不是 DateTimeZOne 类的静态方法。所以只能通过 DateTimeZone 类的对象来访问它。前任。 DateTimeZone dtz = DateTimeZone.forID("America/Port_of_Spain");// America/New_York,Asia/Kolkata DateTimeZone.setDefault(dtz); DateTime dt = new DateTime(2013, 3, 10, 3, 0, dtz); dtz.getOffset(dt.getMillis());
  • 你是对的,修正了我的例子。但是,我的答案保持不变:在请求 TZ 偏移时,必须提供一个瞬间(也就是时间点),因为它会随着时间而变化
【解决方案2】:

2) 你可以通过这种方式获取 TimeZone 对象 - TimeZone tz = TimeZone.getTimeZone("Asia/Kolkata");

3 可以通过这个方法得到offset值——

double timezoneval = 0.0;
        Calendar cal = Calendar.getInstance();
        cal.set(2013, 3, 25, 10, 0,0);
        TimeZone tz = TimeZone.getDefault();
        boolean t = tz.inDaylightTime(cal.getTime());
        if (t)
            timezoneval = ((TimeZone.getDefault().getRawOffset())
                    / (60 * 60 * 1000D) + (TimeZone.getDefault()
                    .getDSTSavings() / (60 * 60 * 1000D)));
        else
            timezoneval = ((TimeZone.getDefault().getRawOffset()) / (60 * 60 * 1000D));

1) 我没听懂你的问题。

此偏移值将适用于夏令时和非夏令时国家。

【讨论】:

  • 您可以放置​​任何有效的时区字符串 id 而不是“亚洲/加尔各答”来获取时区对象。您可以使用 Joda Time API 更轻松地在 Java 中进行日期时间计算
  • 如果你使用的是 JodaTime Api 的 DateTimZone;你必须使用 DateTimeZone 类的静态方法。我假设您使用的是 Java.util.DateTime。
  • @jr 你可以在 JodaTime API 中使用它 - DateTimeZone dtz = DateTimeZone.forID("America/Port_of_Spain");// America/New_York,Asia/Kolkata DateTimeZone.setDefault(dtz); DateTime dt = new DateTime(2013, 3, 10, 3, 0, dtz); dtz.getOffset(dt.getMillis());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多