我有一个时间戳是在UTC,我想将其转换为本地时间,而无需使用类似的API调用TimeZone.getTimeZone("PST")
到底是如何,你应该这样做吗? 我一直在使用没有多少成功的下面的代码:
private static final SimpleDateFormat mSegmentStartTimeFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
}
catch (ParseException e) {
e.printStackTrace();
}
return calendar.getTimeInMillis();
样品输入值: [2012-08-15T22:56:02.038Z]
应返回的等效[2012-08-15T15:56:02.038Z]
Date
在UTC没有时区和内部商店。 只有当日期的格式是时区修正适用。 当使用DateFormat
,默认为它在运行JVM的时区,使用setTimeZone
必要去改变它。
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");
DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));
System.out.println(pstFormat.format(date));
这将打印2012-08-15T15:56:02.038
请注意,我离开了'Z'
的PST格式,因为它表明UTC。 如果你只是去Z
那么输出将是2012-08-15T15:56:02.038-0700
使用流行的Java日期和时间API,这是简单的:
String inputValue = "2012-08-15T22:56:02.038Z";
Instant timestamp = Instant.parse(inputValue);
ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
System.out.println(losAngelesTime);
这版画
2012-08-15T15:56:02.038-07:00[America/Los_Angeles]
注意要点:
- 有一个在你的期望一个小错误。 该
Z
在时间戳指UTC,也称为祖鲁时间。 因此,在您的本地时间值时, Z
不应该在那里。 相反,你会希望有一个返回值,例如像2012-08-15T15:56:02.038-07:00
,因为偏移量是现在-7小时,而不是Z. - 避免三个字母的时区缩写。 他们的不规范,因此经常含糊不清。 PST,例如,可能意味着Philppine标准时间,太平洋标准时间或皮特凯恩标准时间(尽管S IN的缩写常常是夏令时间(指DST))。 如果您打算太平洋标准时间,这甚至不是一个时区,因为在夏天(在您的样本时间戳下降)太平洋夏令时来代替。 取而代之的是缩写的使用时区ID的格式区域/城市在我的代码。
- 时间戳一般情况下最好的处理
Instant
对象。 转换为ZonedDateTime
只有当你有需要,像演讲。
问:我可以使用现代化的API与我的Java版本?
如果使用至少Java 6中,你可以。
- 在Java 8及更高版本的新的API来自内置。
- 在Java 6和7获得的ThreeTen反向移植 ,新类的反向移植(这是ThreeTen对JSR-310,其中首次定义了现代API)。
- 在Android上,使用ThreeTen反向移植了Android版本。 这就是所谓的ThreeTenABP,我认为有一个美妙的解释了这个问题:如何在Android的项目中使用ThreeTenABP 。
这里有一个简单的解决方案修改
public String convertToCurrentTimeZone(String Date) {
String converted_date = "";
try {
DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = utcFormat.parse(Date);
DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone()));
converted_date = currentTFormat.format(date);
}catch (Exception e){ e.printStackTrace();}
return converted_date;
}
//get the current time zone
public String getCurrentTimeZone(){
TimeZone tz = Calendar.getInstance().getTimeZone();
System.out.println(tz.getDisplayName());
return tz.getID();
}