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

Zee*_*Zee 2 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);
Run Code Online (Sandbox Code Playgroud)

现在,如果我在字符串格式中有一个时区/偏移量,即“-04:00”或“+2:00”,如何将其应用于上述内容,以便获得正确的日期?

Bas*_*que 5

tl;博士

Instant.ofEpochMilli( myCountOfMilliseconds ) 
       .atZone( ZoneId.of( "Africa/Tunis" ) )
       .toString()
Run Code Online (Sandbox Code Playgroud)

时间

现代方法使用java.time类而不是现在遗留的麻烦的旧Calendar/Date类。

假设您的毫秒计数是自UTC (1970-01-01T00:00)中 1970 年第一时刻的纪元参考以来的计数,然后解析为.Instant

Instant级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。

Instant instant = Instant.ofEpochMilli( myCountOfMilliseconds ) ;
Run Code Online (Sandbox Code Playgroud)

要从UTC移动到另一个时区,请应用 aZoneId以获取ZonedDateTime.

以、、 或等格式指定正确的时区名称。永远不要使用 3-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/regionAmerica/MontrealAfrica/CasablancaPacific/AucklandESTIST

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
Run Code Online (Sandbox Code Playgroud)

对象与文本

分配时区后,然后以您想要的格式(不是之前)生成一个字符串。您可能将日期时间值(对象)与以文本方式表示其值的字符串混为一谈。学会思考智能对象,而不是愚蠢的字符串。

DateTimeFormatter

要生成特定格式的字符串,请使用DateTimeFormatter. 搜索堆栈溢出,因为这已经被多次覆盖,这里显示的其他概念也是如此。特别值得注意的是DateTimeFormatter.ofLocalized…方法。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多