1

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

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

我需要HH:MM根据当地时间进行更改。例如这个时间是日本、印度、美国等的时间。

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

4

4 回答 4

7

选项 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 真正闪耀的地方。

于 2012-05-25T07:40:37.953 回答
0

使用乔达时间。它比 Java 的日期和时间 API 更好、更安全。有很多方法会返回 LocalTime 对象 (HH:MM)。

例如, new DateTime(your date time).toLocalTime();

于 2012-05-25T07:33:18.563 回答
0

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

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

不过,我还是建议您使用Joda Time,它提供了更清晰的 API。

于 2012-05-25T07:38:14.383 回答
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

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

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

ZonedDateTime

应用 a为任何所需的时区ZoneId生成 a 。ZonedDateTime指定适当的时区名称。永远不要使用 3-4 个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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.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 的试验场。

于 2016-08-15T00:11:33.343 回答