如何在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