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,由Z
( Zulu
缩写,意为UTC)表示。 任何机会的操作系统或PHP设置为Asia/Kabul
或Asia/Tehran
时区? 我想你IRST
在你的输出中报告IRST
,这显然意味着伊朗的时间。 目前在2017年, 这些地区是夏季时间比联合技术提前了四个半小时的唯一地区 。
以America/Montreal
, Africa/Casablanca
, Pacific/Auckland
等continent/region
的格式指定适当的时区名称 。 切勿使用3-4字母缩写(如EST
或IST
或IRST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
如果您想通过特定地区时区的镜头查看您的时刻,请应用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.Date
, Calendar
和SimpleDateFormat
。
Joda-Time项目现在处于维护模式 ,build议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。 规范是JSR 310 。
从何处获取java.time类?
- Java SE 8 , Java SE 9和更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 大部分的java.timefunction都被移植到了ThreeTen-Backport中的 Java 6&7中。
- Android的
- ThreeTenABP项目专门针对Android,采用了ThreeTen-Backport (上文提到)。
- 请参阅如何使用ThreeTenABP …。
ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。
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());