我正在处理一个实时项目,我需要在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
对此有任何帮助对我非常有用。
答案 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 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