我需要将unix时间戳转换为日期对象。 我试了一下:
java.util.Date time = new java.util.Date(timeStamp);
时间戳值:1280512800
日期应该是“2010/07/30 - 22:30:00”(因为我通过PHP得到它),但我得到的是Thu 1月15日23:11:56 IRST 1970。
应该怎么做呢?
我需要将unix时间戳转换为日期对象。 我试了一下:
java.util.Date time = new java.util.Date(timeStamp);
时间戳值:1280512800
日期应该是“2010/07/30 - 22:30:00”(因为我通过PHP得到它),但我得到的是Thu 1月15日23:11:56 IRST 1970。
应该怎么做呢?
当前回答
Date的构造函数期望timeStamp值以毫秒为单位。 将时间戳的值与1000相乘,然后将其传递给构造函数。
其他回答
看起来日历是一种新的方式:
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”部分。
如果你在一个字符串中有时间戳,你需要首先将它解析为long: long . parselong(时间戳)。
https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
java.time
Java 8引入了一个用于处理日期和时间的新API: Java。包的时间。
与java。在UTC, 1970-01-01 t0: 00z,您可以解析自1970年第一个时刻的epoch引用以来的整个秒数。结果是一个即时。
Instant instant = Instant.ofEpochSecond( timeStamp );
如果您需要一个java.util. date来与尚未为java更新的旧代码进行互操作。时间,转换。调用添加到旧类中的新转换方法。
Date date = Date.from( instant );
如果在不同的机器上转换时间戳值,还应该检查该机器的时区。例如;
如果您使用EST或UTC时区运行,上述描述将产生不同的Date值。
设置时区;也就是UTC, 你可以简单地重写;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
java.util.Date time= new java.util.Date((Long.parseLong(timestamp)*1000));
博士tl;
Instant.ofEpochSecond( 1_280_512_800L )
2010 - 07 - 30 - t18:00:00z
java.time
新的java。Java 8及以后版本中内置的时间框架是Joda-Time的继承者。
这些新类包括一个方便的工厂方法,用于从epoch转换整个秒数。您将获得一个Instant,即UTC时间轴上的一个时刻,分辨率最高可达纳秒。
Instant instant = Instant.ofEpochSecond( 1_280_512_800L );
instant.toString (): 2010 - 07 - 30 - t18:00:00z
在IdeOne.com上可以看到代码的实时运行。
亚洲/喀布尔时区还是亚洲/德黑兰时区?
You reported getting a time-of-day value of 22:30 instead of the 18:00 seen here. I suspect your PHP utility is implicitly applying a default time zone to adjust from UTC. My value here is UTC, signified by the Z (short for Zulu, means UTC). Any chance your machine OS or PHP is set to Asia/Kabul or Asia/Tehran time zones? I suppose so as you report IRST in your output which apparently means Iran time. Currently in 2017 those are the only zones operating with a summer time that is four and a half hours ahead of UTC.
请指定合适的时区名称,如“America/Montreal”、“Africa/Casablanca”或“Pacific/Auckland”。不要使用3-4个字母的缩写,如EST或IST或IRST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
如果您希望通过特定地区的时区的镜头来查看您的时刻,请应用ZoneId来获得zoneeddatetime。仍然是同一时刻,但被视为不同的时钟时间。
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 +[亚洲/德黑兰]
从java转换。遗留类的时间
你应该坚持使用新的java。时间类。但如果需要,您可以转换为旧的。
java.util.Date date = java.util.Date.from( instant );
乔达时间
更新:Joda-Time项目现在处于维护模式,团队建议迁移到java。时间类。
供您参考,Joda-Time DateTime的构造函数与此类似:乘以1000得到一个long(而不是int!)
DateTime dateTime = new DateTime( ( 1_280_512_800L * 1000_L ), DateTimeZone.forID( "Europe/Paris" ) );
最好避免臭名昭著的麻烦的java.util.Date和. calendar类。但如果你必须使用日期,你可以从Joda-Time转换。
java.util.Date date = dateTime.toDate();
关于java.time
java。时间框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期-时间类,如java.util。日期,日历和简单日期格式。
Joda-Time项目现在处于维护模式,建议迁移到java。时间类。
要了解更多,请参阅Oracle教程。搜索Stack Overflow可以找到很多例子和解释。规范是JSR 310。
你可以交换java。Time对象直接使用数据库。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java。sql。*类。
从哪里获取java。时间类?
Java SE 8、Java SE 9以及更高版本 内置的。 带有捆绑实现的标准Java API的一部分。 Java 9增加了一些小特性并进行了修复。 Java SE 6和Java SE 7 大部分的java。时间功能在ThreeTen-Backport中向后移植到Java 6和7。 安卓 后续版本的Android捆绑实现的java。时间类。 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP....
ThreeTen-Extra项目扩展了java。额外的课程时间。这个项目是未来可能添加到java.time的一个试验场。你可以在这里找到一些有用的类,比如Interval、YearWeek、YearQuarter等等。
对于1280512800,乘以1000,因为java期望的是毫秒:
java.util.Date time=new java.util.Date((long)timeStamp*1000);
如果你已经有了毫秒,那么只需新建java.util.Date((long)timeStamp);
从文档中可以看到:
分配一个Date对象和 对象初始化它以表示 指定的毫秒数 标准基准时间称为“时” epoch”,即1970年1月1日, 就是格林尼治时间。