Java 将毫秒时间戳转换为相对于给定时区的日期

标签 java date simpledateformat date-formatting timezone-offset

我看过很多这方面的资源,但我无法得到的是在转换毫秒时间戳时,我如何在转换过程中添加相应的时区。

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 个字母的缩写,例如 ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的( !)。

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 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于Java 将毫秒时间戳转换为相对于给定时区的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714322/

相关文章:

java - 如何在java中的jsp中获取实际的服务器名称和ip地址?

java - JNI 检测到应用程序错误 : the return type of CallObjectMethodV does not match void android. media.AudioTrack.play()

java - 当用户输入 "0"时显示错误消息,无法退出 "error"消息

java - java.nio 对 Web 服务器有什么好处?

date - Golang 奇怪的格式日期

java - 确定一周中特定一天的日期

php - 如何将此日期字符串存储在 mysql 数据库中以允许按日期排序?

php - Mysql DATE字段选择格式为yyyy-MM-ddTHH :mm:ss-HH:mm

Java 日期按格式解析

Java 7 Calendar.getInstance、TimeZone.getTimeZone 同步且速度慢,有什么解决方法吗?