如何获得下一个小时的毫秒数

时间:2018-10-02 04:35:42

标签: java date datetime

我要毫秒到下一个小时。例如

现在时间-> 2018年10月2日10:01:23,想要剩余的毫秒数到2018年10月2日11:00:00。

现在时间是动态的,可能是2018年10月2日23:56:56,下一个小时是2018年10月3日00:00:00。

Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(startDate.getMillis());
    calendar.add(Calendar.HOUR, 1);

我正在尝试类似的操作,但是它给startDate增加了1个小时。但是我想下一个小时。

欢迎任何帮助。

4 个答案:

答案 0 :(得分:8)

从Java8开始,您可以使用java.time.LocalDateTime

    LocalDateTime start = LocalDateTime.now();
    // Hour + 1, set Minute and Second to 00
    LocalDateTime end = start.plusHours(1).truncatedTo(ChronoUnit.HOURS);

    // Get Duration
    Duration duration = Duration.between(start, end);
    long millis = duration.toMillis();

现在运行(2018-10-02T18:44:48.943070北京时间)我得到了911 056毫秒。

答案 1 :(得分:1)

一种简单的算术方法:

long hourInMillis = 60 * 60 * 1000;
long startDateInMillis = startDate.getMillis();
long millisSinceLastHourChange = startDateInMillis % hourInMillis;
long millisToNextHourChange = hourInMillis - millisSinceLastHourChange;

从Java 1开始工作;-)

编辑
这种方法没有考虑DST或类似的更改。

答案 2 :(得分:0)

tl; dr

时钟时间并非总是一个小时。

利用时区来处理此类情况。

Duration
.between(
    zonedDateTime_Now ,
    zonedDateTime_FirstMomentOfHourLater 
)
.toMillis()

提防异常

如果要考虑预期时区使用的实际时钟异常,必须指定时区。这意味着使用ZonedDateTime类。

一个小时并不总是一个小时。例如,North Korea recently adjusted its offset-from-UTC by half-an-hour。这意味着一小时的调整仅会持续30分钟。朝鲜的这个例子只是最近的例子之一。世界各地的政客对重新定义时区都表现出惊人的喜好。

时区

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

增加一个小时。

ZonedDateTime hourLater = now.plusHours( 1 ) ;

截断到小时。

ZonedDateTime firstMomentOfNextHour = hourLate.truncatedTo( ChronoUnit.HOURS ) ;

经过的时间

将经过时间计算为Duration对象。

Duration d = Duration.between( now , firstMomentOfNextHour ) ;

java.time 类使用纳秒分辨率,但是您要求的是毫秒。因此请了解,报告毫秒涉及数据丢失。

long milliseconds = d.toMillis() ;

关于 java.time

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

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

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

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:0)

使用ZonedDateTime.untiljava.time解决方案:

ZonedDateTime startDate = ZonedDateTime.now();
LocalDateTime nextHour = startDate.plusHours(1).truncatedTo(ChronoUnit.HOURS);
long msUntillNextHour = startDate.until(nextHour, ChronoUnit.MILLIS);