我看过很多这方面的资源,但我无法得到的是在转换毫秒时间戳时,我如何在转换过程中添加相应的时区。
Date date = new Date(Long.valueOf(dateInMil*1000L);
SimpleDateFormat myDate = new SimpleDateFormat("EEE, MMM d, ''yy");
String formatted = myDate.format(date);
现在,如果我在字符串格式中有一个时区/偏移量,即“-04:00”或“+2:00”,如何将它应用到上面以便我可以获得正确的日期?
最佳答案
tl;dr
Instant.ofEpochMilli( myCountOfMilliseconds )
.atZone( ZoneId.of( "Africa/Tunis" ) )
.toString()
java.time
现代方法使用 java.time 类,而不是麻烦的旧 Calendar
/Date
类,它们现在已经遗留。
假设您的毫秒计数是自 epoch reference 以来的计数1970 年的第一刻 UTC (1970-01-01T00:00),然后解析为 Instant
。
Instant
class 代表时间轴上的一个时刻 UTC分辨率为 nanoseconds (最多九 (9) 位小数)。
Instant instant = Instant.ofEpochMilli( myCountOfMilliseconds ) ;
从 UTC 移动到另一个时区,申请 ZoneId
得到 ZonedDateTime
.
指定 proper time zone name格式为continent/region
,如America/Montreal
, Africa/Casablanca
,或 太平洋/奥克兰
。切勿使用 3-4 个字母的缩写,例如 EST
或 IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
对象与文本
分配时区后,然后 生成所需格式的字符串(不是之前)。您可能将日期时间值(对象)与以文本方式表示其值的字符串混为一谈。学会思考智能对象,而不是愚蠢的字符串。
DateTimeFormatter
要生成特定格式的字符串,请使用 DateTimeFormatter
.搜索 Stack Overflow,因为这已被多次提及,此处显示的其他概念也是如此。特别值得注意的是 DateTimeFormatter.ofLocalized…
方法。
关于java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date
, Calendar
, & SimpleDateFormat
.
Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .
从哪里获得 java.time 类?
- Java SE 8 , Java SE 9 , 然后
- 内置。
- 带有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些次要功能和修复。
- Java SE 6和 Java SE 7
- 许多 java.time 功能在 ThreeTen-Backport 中被反向移植到 Java 6 和 7 .
- Android
- 更高版本的 Android 捆绑了 java.time 类的实现。
- 对于早期的 Android,ThreeTenABP项目适应 ThreeTen-Backport(如上所述)。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于Java 将毫秒时间戳转换为相对于给定时区的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714322/