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

时间:2011-11-24 22:42:27

标签: 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;
}

在上面代替year,month,date我正在通过2011,10,1并且我正在

1317510000

但正确答案是

1317427200

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

7 个答案:

答案 0 :(得分:56)

方法Calendar.getTimeInMillis()Date.getTime()都返回自1970年1月1日以来的毫秒数。

目前,你可以使用:

long seconds = System.currentTimeMillis() / 1000l;

答案 1 :(得分:41)

根据您希望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;

会给你1317427200

答案 2 :(得分:23)

自Java8以来:

java.time.Instant.now().getEpochSecond()

答案 3 :(得分:7)

答案 4 :(得分:4)

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

请注意,month field of Calendar 从零开始,即1月为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;
}

答案 5 :(得分:3)

如果您的参考月份是1月和10月,则可以获得您想要的答案“1317427200”。如果是这样,您要查找的日期是1970-JAN-01和2011-OCT-01,对吗?

然后问题是你几个月来使用的这些数字。

请参阅,如果您查看Calendar API文档或其中提供的常量(“Calendar.JANUARY”,“Calendar.FEBRUARY”等),您会发现月份从0开始(即1月份)。

所以检查你的代码,你将在2月和11月通过,这将导致“1317510000”。

最好的问候。

答案 6 :(得分:1)

java.time

使用Java 8及更高版本中内置的java.time框架。

import java.time.LocalDate;
import java.time.ZoneId;

int year = 2011;
int month = 10;
int day = 1;
int date = LocalDate.of(year, month, day);

date.atStartOfDay(ZoneId.of("UTC")).toEpochSecond; # Long = 1317427200