如何在java中找到自1970年以来的秒数

and*_*ser 35 java

我正在使用一个实时项目,我需要在1970年1月1日之后找到秒数.我使用下面的代码来查找秒数,但是给出了错误的结果.代码如下.

public long returnSeconds(int year, int month, int date) {
    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();
    calendar1.set(1970, 01, 01);
    calendar2.set(year, month, date);
    long milliseconds1 = calendar1.getTimeInMillis();
    long milliseconds2 = calendar2.getTimeInMillis();
    long diff = milliseconds2 - milliseconds1;
    long seconds = diff / 1000;
    return seconds;
}
Run Code Online (Sandbox Code Playgroud)

在上面代替year,month,date我通过2011,10,1和我得到

1317510000
Run Code Online (Sandbox Code Playgroud)

但正确的答案是

1317427200
Run Code Online (Sandbox Code Playgroud)

对此有任何帮助对我非常有用.

miz*_*izo 57

这些方法Calendar.getTimeInMillis()Date.getTime()从1.1.1970都返回毫秒.

目前,您可以使用:

long seconds = System.currentTimeMillis() / 1000l;
Run Code Online (Sandbox Code Playgroud)

  • 有 Calendar.getTimeInMillis() 吗?我以为是`Calendar.getInstance().getTimeInMillis()`。 (2认同)
  • @bubakazouba即1000L,1000长. (2认同)

Aff*_*ffe 42

根据您1317427200作为输出的愿望,有几个层面的问题需要解决.

  • 首先,正如其他人所提到的,java已经使用了UTC 1/1/1970时代.除非你有奇怪的语言环境规则,否则通常不需要计算时期并执行减法.

  • 其次,当您创建新日历时,它会初始化为"现在",因此它包含一天中的时间.更改年/月/日不会影响时间字段.因此,如果您希望它代表日期的午夜,则需要在设置日期之前将日历清零.

  • 第三,你没有说明你应该如何处理时区.夏令时可能会导致特定日历日期所代表的绝对秒数不同,具体取决于JVM的运行位置.由于纪元是UTC,我们可能希望在UTC时间工作?您可能需要向您正在接口的系统的制造商寻求澄清.

  • 第四,Java中的月份是零索引.1月是0月,10月是9月.

把所有这些放在一起

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.clear();
calendar.set(2011, Calendar.OCTOBER, 1);
long secondsSinceEpoch = calendar.getTimeInMillis() / 1000L;
Run Code Online (Sandbox Code Playgroud)

那会给你的 1317427200

  • @Varun Patel对于负数,我预计日期将在1962年,而不是2062 ..... (2认同)

小智 37

从Java8开始:

java.time.Instant.now().getEpochSecond()
Run Code Online (Sandbox Code Playgroud)


exp*_*ert 10

它是Date.getTime().

  • 实际上,“ Date.getTime()”返回的秒数为毫秒,而不是秒。要获取秒,请调用`Date.getTime()/ 1000`。 (2认同)

Phi*_*art 5

您看到的差异很可能是因为您没有Calendar实例的小时,分​​钟,秒和毫秒字段置零:与或一样,Calendar.getInstance()为您提供当前日期和时间new Date()System.currentTimeMillis()

需要注意的是日历的月份字段从零开始的,即一月份为0,而不是1。

另外,不要在数字前加零,这看起来不错,甚至可以工作到8:08在Java中不是有效数字。给数字加上前缀零使编译器假定您将它们定义为八进制数字,该数字最多可以使用07(对于单个数字)。

刚落,calendar1完全(1970-01-01 00:00:00'000是开始时期,即反正零),并做到这一点:

public long returnSeconds(int year, int month, int date) {
    final Calendar cal = Calendar.getInstance();
    cal.set(year, month, date, 0, 0, 0);
    cal.set(Calendar.MILLISECOND, 0);
    return cal.getTimeInMillis() / 1000;
}
Run Code Online (Sandbox Code Playgroud)