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());