使用乔达时间得到UTC给定日期和时区偏移(Using Joda-Time to get UTC of

2019-08-16 15:30发布

我在格式20Jan2013,08Aug2012等日期,有自己特定的时区。 因此,例如,20Jan2013可能有澳大利亚/墨尔本的时区ID,并08Aug2012可能有欧洲/伦敦的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(夏令时间)考虑在内。 因此,例如,如果我有:日期时间thisDate = dtf1.parseDateTime( “30Jan2013”​​);

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

(11:00在端部,而不是10:00)

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

Answer 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)"
}

需要注意几个问题:

  • 这得到默认DateTimeZoneJodaTime。 您可以修改它来接受传递到方法的具体DateTimeZone。
  • 这将返回它像一个格式为“ 山地标准时间(-7小时)”,但你认为合适的很容易就可以对其进行格式化。

希望帮助。

J.P



Answer 2:

如果你只需要区偏移,使用DateTimeZone.forID()来获取时区,然后tz.getOffset(instant) ,以获得与UTC毫秒。

它可能看起来很奇怪,你需要一个即时计算偏移量为UTC但这是必要采取夏令考虑以及在时区的变化。 是的,国家改变他们的时区过一段时间:

为什么时区数据的变化?

时区设置局部采用,并没有世界时区的权威。

编辑此为您提供了正确的结果:

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

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

    DateTime thisDate = dtf1.parseDateTime("30Jul2013").withZone(zone);                                            
    assertEquals( 10 * CommonConstants.MILLISECONDS_PER_HOUR,
        zone.getOffset( thisDate ) );

thisDate.get



Answer 3:

为了乔达给予正确的偏移量,你必须提供一个日期instant.Without日期时间瞬间,这是不可能计算偏移,因为我们有不同的偏移(夏令时)。 这是我会怎么用乔达在+ 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; 


Answer 4:

Java的8 引入了更好的日期和时间处理解决某些语言的限制,以前在这一领域。 我的项目的一些已经开始使用它,而不是乔达。

使用java.time包:

    ZonedDateTime dateTime = LocalDate.of(2013 , 1 , 20).atStartOfDay( ZoneId.of("Australia/Melbourne"));
    ZoneOffset zo = dateTime.getOffset();
    int offset = zo.getTotalSeconds();

    long hours = TimeUnit.SECONDS.toHours(offset);
    long minutes = TimeUnit.SECONDS.toMinutes(offset % 3600);

小时变量被设置为11和分钟为0。

它还计算的分钟偏移,对时区是偏小时,如纽芬兰和拉布拉多加拿大东部:

ZonedDateTime dateTime = LocalDate.of(2013, 1, 20).atStartOfDay( ZoneId.of("Canada/Newfoundland"));

在这种情况下,偏移量是-03:30 (后面UTC三个半小时), hours是-3和minutes为-30。

对于字符串表示,而不是小时和分钟的整数,使用ZoneOffset的toString()方法。 因此,对于上面的例子中,使用方法:

String offsetString = zo.toString();


Answer 5:

当你知道偏移和时间戳所以为了得到当前的时间,你可以使用

 public static String formatMonthDayMinuteByGivenUtcOffset(long timestamp, int offset) {
        return JODA_FORMATTER.print(createDateTime(timestamp, offset));
    }


文章来源: Using Joda-Time to get UTC offset for a given date and timezone