-->

Java中,如何更改GMT时间,本地时间?(Java, How to change GMT time

2019-10-16 17:56发布

服务器发送我的时间是这样的:

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

我需要改变它像HH:MM基于本地时间。 例如这次在日本,印度什么时候,美国等。

我怎样才能做到这一点? 谢谢

Answer 1:

选项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:使用约达时间

乔达时间是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);

请注意,您应该只从字符串表示转换成/当你真的需要。 否则,使用基于您的使用最合适的类型 - 这是在约达时间真正的亮点。



Answer 2:

使用JodaTime。 这远远高于Java的日期和时间API更好,更安全。 有很多会返回一个本地时间对象的方法(HH:MM)。

作为一个例子,新的日期时间(你的约会时间).toLocalTime();



Answer 3:

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

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

我会,不过,建议你使用乔达时间 ,无论如何,它提供了一个更清晰的API。



Answer 4:

其他的答案是正确的,但已经过时。 使用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

解析字符串作为OffsetDateTime表示对象+0100在你的输入,这意味着“UTC提前一小时”。

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

ZonedDateTime

应用ZoneId产生ZonedDateTime任何所需的时区。 指定适当的时区名称 。 切勿使用3-4个字母的缩写,如ESTIST ,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。

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 ,分辨率为纳秒 。

Instant instant = zdt_Montréal.toInstant();

关于java.time

该java.time框架是建立在Java 8和更高版本。 这些类取代旧的麻烦日期时间类,如java.util.Date.Calendar ,与java.text.SimpleDateFormat

该乔达-时间的项目,现在在维护模式 ,建议迁移java.time。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。

多的java.time功能后移植到Java 6和7在ThreeTen-反向移植并且还适于使用Android在ThreeTenABP 。

该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。



文章来源: Java, How to change GMT time to local time?