通过Calendar获取今天的UNIX时间戳

时间:2014-09-01 21:55:13

标签: java

我正在尝试使用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小时返回时间戳。

我在哪里搞砸了?

3 个答案:

答案 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似乎是正确的。

避免使用j.u.Calendar

使用体面的库而不是臭名昭着的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 );

由于我们只需要从当前时刻开始的秒数,因此时区无关紧要。