【问题标题】:how to find seconds since 1970 in java如何在java中找到自1970年以来的秒数
【发布时间】:2012-01-05 23:34:23
【问题描述】:

我正在处理一个实时项目,自 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

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

【问题讨论】:

  • getTimeInMillis() 已经从 Unix 时代(1970 年等)开始测量。如果您查看毫秒1,它应该为零(除非您遇到时区问题)。所以没必要拿差价

标签: java


【解决方案1】:

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

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

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

【讨论】:

  • 我认为 OP 想知道从纪元到特定时间的毫秒数,不一定是“现在”。
  • 有 Calendar.getTimeInMillis() 吗?我以为是Calendar.getInstance().getTimeInMillis()
  • 你为什么要除以 10001?
  • @bubakazouba 1000L,1000 长。
【解决方案2】:

从 Java8 开始:

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

【讨论】:

    【解决方案3】:

    根据您希望1317427200 成为输出的愿望,有几个层面的问题需要解决。

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

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

    • 第三,你没有指定你应该如何处理时区。夏令时可能会导致特定日历日期表示的绝对秒数存在差异,具体取决于您的 JVM 运行的位置。由于时代是 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

    【讨论】:

    • 我的日期和时间是“2062 年 9 月 19 日 02:30:00”,我想得到“-2147483648”,但我没有得到。我目前的结果是“2925858600”。
    • @Varun Patel 对于负数,预计日期是 1962 年,而不是 2062 年.....
    【解决方案4】:

    我是 Date.getTime()

    【讨论】:

    • 实际上 Date.getTime() 返回的数量是 milli 秒,而不是秒。要获得秒数,请致电Date.getTime() / 1000
    【解决方案5】:

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

    请注意,month field of Calendar从零开始,即一月是 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;
    }
    

    【讨论】:

    • 这看起来是问题的唯一完整答案。想知道为什么没有人注意到它。正确的实现,与请求的方法签名相同。
    【解决方案6】:

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

    那么问题出在你几个月都在使用的这些数字上。

    请看,如果您查看日历 API 文档,甚至查看其中提供的常量(“Calendar.JANUARY”、“Calendar.FEBRUARY”等),您会发现月份从 0 开始(即一月)。

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

    最好的问候。

    【讨论】:

    • 哦..我将一月视为 1 这就是为什么我得到错误答案的原因,无论如何我得到了答案。你是对的。谢谢你的回答。
    【解决方案7】:

    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
    

    【讨论】:

      【解决方案8】:

      另一种选择是使用TimeUtils 实用方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        • 2013-01-20
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多