我将以下时间戳存储在一个长变量中:1471906800000这个存储日期18/01/2017 00:00:00
我正在尝试创建另一个时间戳,该时间戳将包含与第一个时间戳中存储的日期相同的日期,但时间为23:59:59 -
我甚至不知道从哪里开始
我怎样才能以最简单的方式在Java中实现这一目标?
感谢。
答案 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。