服务器给我这样的时间:
2012-06-08 17:00:00 +0100
我需要根据当地时间更改HH:MM
。例如,这次是在日本,印度,美国等地的时间。
我该怎么做?感谢
答案 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类。
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
将String解析为OffsetDateTime
对象,表示输入中的+0100
,表示“比UTC早一个小时”。
OffsetDateTime odt = OffsetDateTime.parse( input , f );
ZonedDateTime
应用ZoneId
为任意时区生成ZonedDateTime
。指定proper time zone name。切勿使用诸如EST
或IST
之类的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 8及更高版本中。这些类取代了旧的麻烦日期时间类,例如java.util.Date
,.Calendar
和& java.text.SimpleDateFormat
。
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。
大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP。
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。