我正在尝试将下面的date时间string对象转换为unix时期时间戳值。 然而,当我运行程序时,我注意到它产生了一个1404461110000的纪元价值,当我检查我的Ubuntu的unix机器是星期三8月18日18:06:40然而在现实中,我正在通过七月04 2014-07-04 04: 05:10。 我的ubuntu机器上有一个美国/多伦多的时区,但我不认为这是重要的?
Java代码:
long epoch = 0; String str = "2014-07-04 04:05:10"; // UTC DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date datenew = df.parse(str); epoch = datenew.getTime(); System.out.println(epoch); // prints 1404461110000
Ubuntu Linux 14.04
date -d@1404461110000
显示= 8月7日星期三18:06:40 EDT 46475
问题是,在Java中调用getTime()
时,不会处理unix时间戳 。 Unix时间戳以秒为单位表示,而你从Java获得的值是自纪元 (1970年1月1日)以来的毫秒数 ,因此是差别。
这将是:
epoch = datenew.getTime() / 1000;
这应该会让你至少接近两万年。 如果在此之后仍然看到差异,则它与时区相关,并且可以通过在DateFormat
实例上指定时区来适应。
您需要告诉Java,时间戳是UTC,而不是仅仅添加注释。
long epoch = 0; String str = "2014-07-04 04:05:10"; // UTC DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); df.setTimeZone(TimeZone.getTimeZone("UTC")); // assume UTC Date datenew = df.parse(str); epoch = datenew.getTime(); System.out.println(epoch);
仅供参考,这里是相同类型的代码,但在Joda-Time 2.4中完成。 Java 8中新的java.time包 (受Joda-Time启发)可以以类似的方式使用。
java.util.Date和.Calendar类是非常麻烦的。 避免他们。 使用上面提到的两个库中的任何一个。
您的输入字符串接近标准的ISO 8601格式,但不完全是缺少中间的T
和UTC的偏移量。 Joda-Time在ISO 8601中有一个用于解析/生成的内置格式化程序。因此,我们不需要定义我们自己的格式化程序,而是稍微调整输入字符串,插入T
String inputRaw = "2014-07-04 04:05:10"; // UTC String input = inputRaw.replace( " ", "T" ); // Convert to standard ISO 8601 format.
然后我们将告诉DateTime构造函数将字符串解析为UTC(零偏移量)。 与java.util.Date不同,DateTime知道它自己分配的时区。
DateTime dateTimeUtc = new DateTime( input, DateTimeZone.UTC );
易于调整到多伦多时间,为乐趣或调试/健全性检查。
DateTime dateTimeToronto = dateTimeUtc.withZone( DateTimeZone.forID( "America/Toronto" ) );
和java.util.Date一样,Joda-Time内部追踪时间为自UTC时代(1970年初)以UTC开始的毫秒数。 这意味着使用64位而不是通常的32位int
。 (顺便说一下,java.time跟踪的是纳秒 。)所以,如果我们需要seconds-since-unix-epoch,除以一千。
long millisecondsSinceEpoch = dateTimeUtc.getMillis(); // Use a "long", not "int". long secondsSinceEpoch = ( millisecondsSinceEpoch / 1000L );
转储到控制台。
System.out.println( "input: " + input ); System.out.println( "dateTimeUtc: " + dateTimeUtc ); System.out.println( "dateTimeToronto: " + dateTimeToronto ); System.out.println( "millisecondsSinceEpoch: " + millisecondsSinceEpoch ); System.out.println( "secondsSinceEpoch: " + secondsSinceEpoch );
运行时。
input: 2014-07-04T04:05:10 dateTimeUtc: 2014-07-04T04:05:10.000Z dateTimeToronto: 2014-07-04T00:05:10.000-04:00 millisecondsSinceEpoch: 1404446710000 secondsSinceEpoch: 1404446710