在Java

时间:2017-01-20 11:17:46

标签: java date timestamp

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

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

我甚至不知道从哪里开始

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

感谢。

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

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

您应该使用日期/时间库。我更了解jodatime,所以这个例子是用这个编写的,但是你可以使用Java 8时间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();

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

答案 2 :(得分:1)

其他两个Answers都使用过时的类,现在由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 );

但是,我怀疑你采用错误的方法来处理日期时间值。我强烈建议您遵循使用半开放式方法的常见做法,而不是试图确定一天结束。在半开放中,开头是包含,而结尾是独占

所以整整一天从一天的第一个时刻开始,一直到第二天的第一个时刻,但不包括在内。这样你可以避免最后一秒的问题,或者试图获得一秒钟的无限可分部分。

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

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

关于java.time

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

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore