服务器向我发送这样的时间:
2012-06-08 17:00:00 +0100
我需要HH:MM
根据当地时间进行更改。例如这个时间是日本、印度、美国等的时间。
我怎样才能做到这一点?谢谢
选项 1:使用java.util.Date
/ Calendar
:
首先,您需要将值解析为 a 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 的日期和时间 API 更好、更安全。有很多方法会返回 LocalTime 对象 (HH:MM)。
例如, new DateTime(your date time).toLocalTime();
java.util.Date始终采用 UTC。是什么让你觉得是当地时间?我怀疑问题在于您是通过使用本地时区的 Calendar 实例来显示它,或者可能使用也使用本地时区的 Date.toString() 来显示它。
如果这不是问题,请发布一些示例代码。
不过,我还是建议您使用Joda Time,它提供了更清晰的 API。
其他答案是正确的,但已过时。请改用 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
应用 a为任何所需的时区ZoneId
生成 a 。ZonedDateTime
指定适当的时区名称。永远不要使用 3-4 个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId zoneId_Kolkata = ZoneId.of( "Asia/Kolkata" ); // India
ZonedDateTime zdt_Kolkata = odt.atZone( zoneId_Kolkata );
……还有一个……</p>
ZoneId zoneId_Montréal = ZoneId.of( "Asia/Montreal" ); // Québec Canada
ZonedDateTime zdt_Montréal = odt.atZone( zoneId_Montréal );
Instant
对于 UTC,提取一个Instant
对象。该类代表UTCInstant
时间线上的一个时刻,分辨率为nanoseconds。
Instant instant = zdt_Montréal.toInstant();
java.time框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date
, .Calendar
, & java.text.SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到 java.time。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。
许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应Android。
ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。