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

我正在使用一个实时项目,我需要找到自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和iam得到

 1317510000 

但正确的答案是

 1317427200 

任何有关这方面的帮助对我都非常有用。

基于您希望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

Calendar.getTimeInMillis()Date.getTime()都返回自1.1.1970以来的毫秒数。

目前,您可以使用:

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

从Java8开始:

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

它是Date.getTime()

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

请注意, Calendar的month字段 从零开始 ,即January为0,而不是1。

另外,不要在数字前加零,这可能看起来不错,它甚至可以工作,直到你达到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; } 

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

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

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

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

最好的祝福。

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