我要毫秒到下一个小时。例如
现在时间-> 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个小时。但是我想下一个小时。
欢迎任何帮助。
答案 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)
时钟时间并非总是一个小时。
利用时区来处理此类情况。
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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:0)
使用ZonedDateTime.until
的java.time
解决方案:
ZonedDateTime startDate = ZonedDateTime.now();
LocalDateTime nextHour = startDate.plusHours(1).truncatedTo(ChronoUnit.HOURS);
long msUntillNextHour = startDate.until(nextHour, ChronoUnit.MILLIS);