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

如何在java中查找自1970年以来的秒数,java,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);

我在一个实时项目中工作,从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;
}
在上面的
年、月、日
中,我将通过
2011,10,1
并获得

1317510000
但正确的答案是

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

这些方法和它们都返回自1970年1月1日以来的毫秒数

对于当前时间,您可以使用:

long seconds = System.currentTimeMillis() / 1000l;
如果你的参考月份是1月和10月,那么你想要的答案是1317427200。如果是这样的话,您要查找的日期是1970年1月1日和2011年10月1日,对吗

那么问题是你几个月使用的这些数字

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

因此,检查您的代码,您将通过二月和十一月,这将导致“1317510000”


致以最诚挚的问候。

基于您希望输出
1317427200
的愿望,有几层问题需要解决

  • 首先,正如其他人所提到的,java已经使用UTC 1/1/1970纪元。除非您有奇怪的区域设置规则,否则通常不需要计算历元并执行减法

  • 第二,当你创建一个新的日历时,它被初始化为“现在”,所以它包括一天中的时间。更改年/月/日不会影响时间字段。因此,如果希望它表示日期的午夜,则需要在设置日期之前将日历归零

  • 第三,您还没有指定如何处理时区。夏时制可能会导致挂机日期上特定日历表示的绝对秒数出现差异,具体取决于JVM运行的位置。由于epoch是UTC,我们可能想在UTC时间工作?您可能需要向您所连接系统的制造商寻求澄清

  • 第四,Java中的月份是零索引的。一月是0,十月是9

把这些放在一起

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.clear();
calendar.set(2011, Calendar.OCTOBER, 1);
long secondsSinceEpoch = calendar.getTimeInMillis() / 1000L;

这将为您提供
1317427200

您看到的差异很可能是因为您没有将
日历实例的小时、分钟、秒和毫秒字段归零:
日历。getInstance()
为您提供当前的日期和时间,就像
新日期()
系统.currentTimeMillis()

请注意,该值是基于零的,即一月是0,而不是1

另外,不要在数字前面加上零,这看起来很不错,甚至可以一直用到8:
08
在Java中不是有效的数字。在数字前面加上零会使编译器假定您将它们定义为八进制数字,这只适用于
07
(对于单个数字)

只需完全删除日历1(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;
}
java.time 使用内置于Java8及更高版本中的框架

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
自Java8以来:

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

另一个选项是使用
TimeUtils
实用程序方法:

TimeUtils.millisToUnit(System.currentTimeMillis(), TimeUnit.SECONDS)

getTimeInMillis()
已经从Unix时代(1970年等)开始测量。如果你看毫秒1,它应该是零(除非你遇到时区问题)。因此,不必考虑差异。我认为OP想要知道从历元到特定时间的毫秒数,而不一定是到“现在”。是否有日历。getTimeInMillis()?我还以为是Calendar.getInstance().getTimeInMillis()
。你为什么要按10001来定呢?@bubakazouba那是1000L,1000倍长。哦。。我把1月当作1月,这就是为什么我得到了错误的答案,不管怎样我都得到了答案。你是对的。谢谢你的答案。我的日期和时间是“2062年9月19日02:30:00”,我想得到“-2147483648”,但我没有得到。我当前的结果是“2925858600”。@Varun Patel对于一个负数,期望日期是1962年,而不是2062年……实际上
date.getTime()
返回毫秒数,而不是秒数。要获得秒数,请调用Date.getTime()/1000。这似乎是该问题的唯一完整答案。。想知道为什么没人注意到。正确的实现,与请求的方法签名相同。