【问题标题】:Converting timestamp to hours in java在java中将时间戳转换为小时
【发布时间】:2017-01-20 11:17:46
【问题描述】:

我将以下时间戳存储在一个长变量中:1471906800000 这存储日期 18/01/2017 00:00:00

我正在尝试创建另一个时间戳,该时间戳将包含与第一个时间戳中存储的日期相同的日期,但时间为 23:59:59 -

我什至不知道从哪里开始

我怎样才能在 Java 中以最简单的方式实现这一点?

谢谢。

【问题讨论】:

  • 为此使用 java.util.Calender
  • 使用正则表达式函数查找日期并将 18/01/2017 00:00:00 替换为 18/01/2017 23:59:59 并在需要时保存为字符串,您将类型转换为日期类型。
  • @JosephMwema 这几乎是最糟糕的方法。这就是日期/时间库的用途。
  • 你的时间戳应该怎么解释,也就是那个数字是什么意思?

标签: java date timestamp


【解决方案1】:

使用日历将帮助您:

  long l = 1471906800000l;
  Date date = new Date(l);
  Calendar calendar = Calendar.getInstance();
  calendar.setTime(date);
  calendar.set(Calendar.HOUR, 23);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  l = calendar.calendar.getTimeInMillis();

【讨论】:

  • 但您的日期并未导致问题中所述的18/01/2017 00:00:00,可能长的解释不同(或问题错误)
【解决方案2】:

其他两个答案都使用过时的类,现在被 java.time 类取代。

也许您的输入数字是从 1970 年 UTC 第一时刻的纪元开始的毫秒数 (1970-01-01T00:00:00Z)。但我没有得到你在问题中所说的结果。

long input = 1_471_906_800_000L ;
Instant instant = Instant.ofEpochMilli( input );

输入:1471906800000

即时:2016-08-22T23:00:00Z

但您预计 18/01/2017 00:00:00 的值会相差几个月。如果您的输入不是来自1970-01-01T00:00:00Z 的毫秒数,您需要编辑您的问题以指定。

如果您的预期输出有误,那么让我们继续设置时间。

如果您想要一天结束前的一秒,我建议从第二天开始减去一秒,而不是硬编码23:59:59 的时间。由于夏令时 (DST) 等异常情况,该时间可能无效。此外,除非您打算在 UTC 工作,否则您需要进入所需/预期的时区。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

提取一个LocalDate,作为没有时间和时区的仅日期值。

LocalDate ld = zdt.toLocalDate(); 

移到第二天。

LocalDate ldNextDay = ld.plusDays( 1 );

要求第一时间。

ZonedDateTime zdtNextDay = ldNextDay.atStartOfDay( z );

减去一秒以回到前一天。

ZonedDateTime zdtPreviousDay = zdtNextDay.minusSeconds( 1L );

但是,我怀疑您在处理日期时间值时采用了错误的方法。与其试图确定一天的结束,我强烈建议您遵循使用半开放方法来处理时间跨度的常见做法。在 Half-Open 中,开头是 inclusive 而结尾是 exclusive

因此,一整天从一天的第一刻开始,一直持续到但不包括第二天的第一刻。这样你就可以避免最后一秒的问题或试图获得一秒的无限可分部分。

ZonedDateTime zdtDayStart = LocalDate.of( 2017 , Month.JANUARY , 18 ).atStartOfDay( 1 );
ZonedDateTime zdtDayStop = zdtDayStart.plusDays( 1 );

您可能会发现 ThreeTen-Extra 项目中的 Interval 类很有帮助。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    我假设您不是特别想要 23:59:59 的时间,而是第二天开始前 1 分钟的时间。

    您应该使用日期/时间库。我对 jodatime 比较了解,所以这个例子就是用它来写的,不过你可以改用 Java 8 time API。

    DateTime today = new DateTime(1471906800000L, TIME_ZONE);
    // You may want to check that today is actually at the start of the day.
    // e.g. today.equals(today.withTimeAtStartOfDay());
    
    DateTime lastMinuteOfToday =
         today.toLocalDate()
             .plusDays(1)
             .toDateTimeAtStartOfDay(TIME_ZONE)
             .minusMinutes(1);
    
    long lastMinuteOfTodayMillis = lastMinuteOfToday.getMillis();
    

    了解时区对于正确执行此操作很重要。

    【讨论】:

    • 此代码使用 Java 8 及更高版本中的 java.time 类。没有DateTime 这样的类。可能是 Joda-Time 代码。
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多