【发布时间】:2012-05-31 19:00:31
【问题描述】:
服务器向我发送这样的时间:
2012-06-08 17:00:00 +0100
我需要根据当地时间将其更改为HH:MM。比如这个时间是日本、印度、美国等的时间。
我该怎么做?谢谢
【问题讨论】:
标签: java time format localtime
服务器向我发送这样的时间:
2012-06-08 17:00:00 +0100
我需要根据当地时间将其更改为HH:MM。比如这个时间是日本、印度、美国等的时间。
我该怎么做?谢谢
【问题讨论】:
标签: java time format localtime
其他答案正确但已过时。请改用 java.time 类。
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" ) );
定义一个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。指定proper time zone name。切勿使用 3-4 个字母的缩写,例如 EST 或 IST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date、.Calendar 和java.text.SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到 java.time。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。
大部分 java.time 功能在ThreeTen-Backport 中向后移植到Java 6 和7,并进一步适应ThreeTenABP 中的Android。
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。
【讨论】:
选项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 真正闪耀的地方。
【讨论】:
java.util.Date 是 always 在 UTC 中。是什么让你觉得是当地时间?我怀疑问题是您通过使用本地时区的 Calendar 实例显示它,或者可能使用也使用本地时区的 Date.toString() 。
如果这不是问题,请发布一些示例代码。
不过,我还是建议您使用 Joda Time,它提供了更清晰的 API。
【讨论】:
java.util.Date,大概只有一个字符串。并且没有 java.util.Calendar 显然不涉及,因为该接口/类默认情况下不会生成问题中看到的输出。此外,在没有一些解释和示例代码的情况下,仅仅提及库通常不足以回答 Stack Overflow。
使用 JodaTime。它比 Java 的日期和时间 API 更好、更安全。有很多方法会返回 LocalTime 对象 (HH:MM)。
例如 new DateTime(your date time).toLocalTime();
【讨论】: