使用 Joda-Time 获取给定日期和时区的 UTC 偏移量

2022-09-03 01:21:48

我有20Jan2013,08Aug 2012等格式的日期,以及他们自己的特定时区。例如,2013 年 1 月的时区 ID 可能为澳大利亚/墨尔本,而 2012 年 8 月的时区 ID 可能为欧洲/伦敦。我想做的是根据这些时区和日期,计算给定日期该时区的UTC偏移量。到目前为止,我已经想出了这个:

DateTimeFormatter dtf = DateTimeFormat.forPattern("ZZ");
DateTimeFormatter dtf1 = DateTimeFormat.forPattern("ddMMMYYYY");

DateTimeZone zone = DateTimeZone.forID("Australia/Melbourne");  

DateTime thisDate = dtf1.parseDateTime("30Jul2013");                                            
System.out.println("\nZone: " + thisDate.withZone(zone));

这给了我输出:

Zone: 2013-07-30T00:00:00.000+10:00

这是正确的,但我只想从中提取UTC偏移量,在本例中为+10:00。我一直在寻找方法来做到这一点,但找不到任何东西。有什么办法可以做到这一点吗?我看到的唯一选择是将输出转换为字符串,并使用子字符串方法来获取UTC偏移量。

上述代码确实考虑了 DST(夏令时)。例如,如果我有:DateTime thisDate = dtf1.parseDateTime(“30Jan2013”);

输出为:2013-01-30T00:00:00.000+11:00

(+11:00在结束时,而不是+10:00)

因此,基本上我需要做的就是找到一种方法从2013-07-30T00:00:00.000 + 11:00中提取+ 11:00。请帮忙!


答案 1

获取时区名称和偏移量(以小时为单位)的简单方法

public static String getCurrentTimeZoneOffset() {
    DateTimeZone tz = DateTimeZone.getDefault();
    Long instant = DateTime.now().getMillis();

    String name = tz.getName(instant);

    long offsetInMilliseconds = tz.getOffset(instant);
    long hours = TimeUnit.MILLISECONDS.toHours( offsetInMilliseconds );
    String offset = Long.toString( hours );

    return name + " (" + offset + " Hours)";
    // Example: "Mountain Standard Time (-7 Hours)"
}

一些注意事项:

  • 这从JodaTime获得默认值。您可以对其进行修改,以接受传递到方法中的特定 DateTimeZone。DateTimeZone
  • 这将以“山地标准时间(-7小时)”之类的格式返回它,但您可以轻松地将其格式化为合适的格式。

希望有所帮助。

太平绅士


答案 2

为了使 Joda 给出正确的偏移量,您必须提供日期时间即时。如果没有日期时间即时,则无法计算偏移量,因为我们有不同的偏移量(夏令时)。这就是我如何使用Joda以+ HH:mm格式获得偏移量:

    int offsetInMillis = DateTimeZone.forID(zoneId).getOffset(new DateTime().getMillis());
    String offset = String.format("%02d:%02d", Math.abs(offsetInMillis / 3600000),
            Math.abs((offsetInMillis / 60000) % 60));
    offset = (offsetInMillis >= 0 ? "+" : "-") + offset; 

推荐