我正在尝试使用Java的日历在00:00:00获取今天的UNIX时间戳(自1970年1月1日起经过的秒数):
public long getTodayTimestamp() {
Calendar c = Calendar.getInstance(Locale.getDefault());
c.setTimeInMillis(System.currentTimeMillis());
c.set( c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH),
0, 0, 0
);
return c.getTimeInMillis()/1000;
}
问题是它今天(9月1日)返回1409608800,但是当我尝试使用某些转换器(例如http://www.onlineconversion.com/unix_time.htm)进行转换时,我得到Mon, 01 Sep 2014 22:00:00 GMT
这是当地时间9月2日午夜。基本上,该方法是在我需要的时间之前24小时返回时间戳。
我在哪里搞砸了?
答案 0 :(得分:1)
在线转换器返回日期UTC + 0
你在TimeZone +2。
这意味着:22:00:00(UTC + 0)在您的时区中为00:00:00(UTC + 2)
所以,当我没有错的时候(我希望如此),一切似乎都是正确的。
修改强>
您案件中的问题:
getTodayTimestamp()方法返回UTC + 0的时间戳
(getCalendar.getTimeInMillis以UTC + 0返回)
这意味着您所在地区(UTC + 2)的00:00:00为UTC + 0的22:00:00
这就是转换器显示的内容!
见这里:
http://docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis()
答案 1 :(得分:0)
你可以通过艰难的方式获得unix时间: - )
至少你不必与语言环境等争吵
public class GetUnixTime {
public static void main(String[] args) throws IOException,
InterruptedException {
ProcessBuilder ps = new ProcessBuilder("date");
ps.redirectErrorStream(true);
Process pr = ps.start();
StringWriter sw = new StringWriter();
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
sw.write(line);
}
pr.waitFor();
in.close();
sw.flush();
sw.close();
System.out.println(">"+sw.toString()+"<"); //parse this guy
}
}
答案 2 :(得分:0)
answer by Ben似乎是正确的。
使用体面的库而不是臭名昭着的java.util.Date和.Calendar类,日期时间工作要容易得多。在Java 8中使用Joda-Time或新的java.time包。这两个库都明确且清楚地处理时区。
Joda-Time 2.4中的示例。
DateTime nowParis = DateTime.now( DateTimeZone.forID( "Europe/Paris" ) );
DateTime nowUtc = nowParis.withZone( DateTimeZone.UTC );
long millisecondsSinceUnixEpoch = nowParis.getMillis(); // Some result when called on either nowParis or nowUtc.
long secondsSinceUnixEpoch = ( millisecondsSinceUnixEpoch / 1000L );
在这些DateTime对象上调用toString
以验证其值。
或者在一行中。
long secondsSinceUnixEpoch = ( DateTime.now().getMillis() / 1000L );
由于我们只需要从当前时刻开始的秒数,因此时区无关紧要。