Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从今天开始';带日历的UNIX时间戳_Java - Fatal编程技术网

Java 从今天开始';带日历的UNIX时间戳

Java 从今天开始';带日历的UNIX时间戳,java,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),

我正在尝试使用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,但当我尝试使用某些转换器转换它时(例如),我得到了2014年9月1日星期一22:00:00 GMT,也就是当地时间9月2日午夜。基本上,该方法是提前24小时返回时间戳


哪里出错了?

在线转换器返回UTC+0的日期
您所在的时区为+2。
这意味着:22:00:00(UTC+0)是您所在时区的00:00:00(UTC+2)
所以,当我没有错的时候(我希望如此),一切似乎都是正确的

编辑:
您案例中的问题:
方法getTodayTimestamp()返回UTC+0中的时间戳
(getCalendar.getTimeInMillis以UTC+0为单位返回)
这意味着您所在地区的00:00:00(UTC+2)是UTC+0的22:00:00
这就是转换器显示的内容

请参见此处:

您可以通过艰难的方式获得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
    }
}
公共类GetUnixTime{
公共静态void main(字符串[]args)引发IOException,
中断异常{
ProcessBuilder ps=新的ProcessBuilder(“日期”);
ps.errorstream(真);
进程pr=ps.start();
StringWriter sw=新的StringWriter();
BufferedReader in=新的BufferedReader(新的InputStreamReader(pr.getInputStream());
弦线;
而((line=in.readLine())!=null){
sw.write(行);
}
pr.waitFor();
in.close();
sw.flush();
sw.close();
System.out.println(“>”+sw.toString()+”tl;dr
细节
结果似乎是正确的

避免使用j.u.Calendar 使用一个像样的库,而不是臭名昭著的麻烦的java.util.Date和.Calendar类,日期-时间工作会容易得多。可以使用java 8中的java.time或新的java.time包。这两个库都显式且清晰地处理时区

java.time 使用捕获UTC中的当前时刻。根据定义,
即时
始终以UTC为单位

Instant instant = Instant.now() ;  // Capture current moment in UTC.
显然,您需要一个整秒的计数,因为纪元引用了UTC中1970年的第一个时刻

long secondsSinceEpoch = instant.getEpochSecond() ;  // Get the whole seconds component within an `Instant`, ignoring any fractional second.
乔达时间 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 );

因为从当前时刻开始,我们只需要几秒钟,所以时区并不重要。

因为“问题”“?为什么不能只使用
日期
系统
?因为问题,我要花半个小时来解释。编辑:哦,对不起,这部分是在问题有更广泛的焦点时留下的。当然,我可以在方法中使用日期或任何东西,但如何使用?在这种情况下,为什么它比日历工作得更好?您可以设置时区?”?()将
日历
的时区设置为GMT+0
日历
维护了时区的概念,这意味着如果将时区设置为
GMT+0
,则会删除任何本地详细信息。例如,现在,我是
GMT+10
。因此,通常情况下,它会打印
1409609943979
,但
GMT+0
会打印
1409609943993
但是该方法应该返回当天的开始,而不是第二天的开始。您必须与系统区域设置进行斗争,您的程序对于某些环境变量的行为会有所不同,等等。。。
long secondsSinceUnixEpoch = ( DateTime.now().getMillis() / 1000L );