Java,如何将GMT时间更改为当地时间?

时间:2012-05-25 07:29:37

标签: java time format localtime

服务器给我这样的时间:

  

2012-06-08 17:00:00 +0100

我需要根据当地时间更改HH:MM。例如,这次是在日本,印度,美国等地的时间。

我该怎么做?感谢

4 个答案:

答案 0 :(得分:7)

选项1:使用java.util.Date / Calendar

首先,您需要将值解析为Date,然后以格式和时区重新格式化 你对以下内容感兴趣:

SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z",
                                                    Locale.US);
Date date = inputFormat.parse(inputText);

// Potentially use the default locale. This will use the local time zone already.
SimpleDateFormat outputFormat = new SimpleDateFormat("HH:mm", Locale.US);
String outputText = outputFormat.format(date);

选项2:使用Joda Time

Joda Time是一个更好的Java日期/时间库。

DateTimeFormatter inputFormatter = DateTimeFormat
    .forPattern("yyyy-MM-dd HH:mm:ss Z")
    .withLocale(Locale.US);

DateTime parsed = inputFormatter.parseDateTime(inputText);

DateTimeFormatter outputFormatter = DateTimeFormat
    .forPattern("HH:mm")
    .withLocale(Locale.US)
    .withZone(DateTimeZone.getDefault());

String outputText = outputFormatter.print(parsed);

请注意,在真正需要时,您应该只转换为字符串表示形式。否则,根据您的使用情况使用最合适的类型 - 这就是Joda Time真正闪耀的地方。

答案 1 :(得分:0)

使用JodaTime。它比Java的Date and Time API更好,更安全。有很多方法可以返回LocalTime对象(HH:MM)。

例如,新的DateTime(您的日期时间).toLocalTime();

答案 2 :(得分:0)

java中的java.util.Date总是 。是什么让你觉得它是在当地时间?我怀疑问题是你通过使用本地时区的Calendar实例显示它,或者可能使用也使用本地时区的Date.toString()。

如果这不是问题,请发布一些示例代码。

但是,无论如何,我建议您使用Joda Time,这样可以提供更清晰的API。

答案 3 :(得分:0)

其他答案是正确但过时的。请改用java.time类。

TL;博士

ZonedDateTime zdt_Kolkata = OffsetDateTime.parse( "2012-06-08 17:00:00 +0100" , DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss Z" ) ).atZone( ZoneId.of( "Asia/Kolkata" ) );

使用java.time

定义DateTimeFormatter格式设置模式以匹配您的输入字符串。

String input = "2012-06-08 17:00:00 +0100";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss Z" );

OffsetDateTime

将String解析为OffsetDateTime对象,表示输入中的+0100,表示“比UTC早一个小时”。

OffsetDateTime odt = OffsetDateTime.parse( input , f ); 

ZonedDateTime

应用ZoneId为任意时区生成ZonedDateTime。指定proper time zone name。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId zoneId_Kolkata = ZoneId.of( "Asia/Kolkata" ); // India
ZonedDateTime zdt_Kolkata = odt.atZone( zoneId_Kolkata );

......和另一个......

ZoneId zoneId_Montréal = ZoneId.of( "Asia/Montreal" ); // Québec Canada
ZonedDateTime zdt_Montréal = odt.atZone( zoneId_Montréal );

Instant

对于UTC,提取Instant个对象。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds

Instant instant = zdt_Montréal.toInstant();

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。