我正在使用一个实时项目,我需要在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)
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
您看到的差异很可能是因为您没有将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)
归档时间: |
|
查看次数: |
91696 次 |
最近记录: |