Java:来自unix时间戳的date

我需要将一个unix时间戳转换为一个date对象。
我试过这个:

java.util.Date time = new java.util.Date(timeStamp); 

时间戳值是: 1280512800

date应该是“2010/07/30 – 22:30:00”(正如我得到的PHP),而是我得到Thu Jan 15 23:11:56 IRST 1970

应该怎么办?

乘以1000,因为java期待毫秒:

 java.util.Date time=new java.util.Date((long)timeStamp*1000); 

从文档 :

分配一个Date对象并初始化它,以表示从标准基准时间(即“纪元”,即1970年1月1日00:00:00 GMT)开始的指定毫秒数。

这是正确的方法:

 Date date = new Date (); date.setTime((long)unix_time*1000); 

java.time

Java 8引入了一个用于处理date和时间的新API: java.time包 。

使用java.time可以使用:

 Date date = Date.from( Instant.ofEpochSecond( timeStamp ) ); 

Instant代表Java 8中的时间戳。使用静态Date.from()方法,您可以将Instant转换为java.util.Date实例。

看起来像日历是新的方式去:

 Calendar mydate = Calendar.getInstance(); mydate.setTimeInMillis(timestamp*1000); out.println(mydate.get(Calendar.DAY_OF_MONTH)+"."+mydate.get(Calendar.MONTH)+"."+mydate.get(Calendar.YEAR)); 

最后一行只是一个例子,如何使用它,这将打印例如“14.06.2012”。

如果使用System.currentTimeMillis()保存时间戳,则不需要“* 1000”部分。

如果你有一个string的时间戳,你需要首先parsing它:Long.parseLong(timestamp)。

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html

TL;博士

 Instant.ofEpochSecond( 1_280_512_800L ) 

2010-07-30T18:00:00Z

java.time

Java 8及更高版本中内置的新java.time框架是Joda-Time的后续版本。

这些新类包括一个方便的工厂方法来转换从纪元的整秒计数 。 在UTC时间线上,您可以获得Instant ,分辨率高达毫微秒。

 Instant instant = Instant.ofEpochSecond( 1_280_512_800L ); 

instant.toString():2010-07-30T18:00:00Z

看到代码在IdeOne.com上运行 。

Asia/Kabul还是Asia/Tehran时区?

您报告的时间是22:30,而不是这里看到的18:00。 我怀疑你的PHP实用程序隐式应用默认时区来从UTC调整。 我在这里的价值是UTC,由ZZulu缩写,意为UTC)表示。 任何机会的操作系统或PHP设置为Asia/KabulAsia/Tehran时区? 我想你IRST在你的输出中报告IRST ,这显然意味着伊朗的时间。 目前在2017年, 这些地区是夏季时间比联合技术提前了四个半小时的唯一地区 。

America/MontrealAfrica/CasablancaPacific/Aucklandcontinent/region的格式指定适当的时区名称 。 切勿使用3-4字母缩写(如ESTISTIRST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

如果您通过特定地区时区的镜头查看您的时刻,请应用ZoneId以获取ZonedDateTime 。 同时也是同一时刻,但被视为不同的挂钟时间 。

 ZoneId z = ZoneId.of( "Asia/Tehran" ) ; ZonedDateTime zdt = instant.atZone( z ); // Same moment, same point on timeline, but seen as different wall-clock time. 

2010-07-30T22:30 + 04:30 [亚洲/德黑兰]

从java.time转换为旧类

你应该坚持使用新的java.time类。 但是如果需要,你可以转换成旧的。

 java.util.Date date = java.util.Date.from( instant ); 

乔达时间

更新: Joda-Time项目现在处于维护模式 ,团队build议迁移到java.time类。

仅供参考, Joda-Time DateTime的构造函数是类似的:乘以一千以产生一个long (不是int !)。

 DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) ); 

最好避免出现臭名昭着的java.util.Date和.Calendar类。 但是,如果您必须使用date,则可以从Joda-Time转换。

 java.util.Date date = dateTime.toDate(); 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的遗留date时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。

从何处获取java.time类?

  • Java SE 8Java SE 9和更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
  • Android的
    • ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
    • 请参阅如何使用ThreeTenABP …。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

Date的构造函数期望timeStamp值以毫秒为单位。 用1000乘以你的时间戳的值,然后传给构造函数。

如果要在不同的计算机上转换时间戳值,则还应该检查该计算机的时区。 例如;

如果您使用EST或UTC时区运行,上述描述将导致不同的date值。

设置时区; 又名UTC,你可以简单地重写;

  TimeZone.setDefault(TimeZone.getTimeZone("UTC")); java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000)); 
 Date d = new Date(i * 1000 + TimeZone.getDefault().getRawOffset());