午夜以来的时间

4

我正在使用一个Java库,其中有一个需要时间信息的方法。它被描述为:

public void function(byte[] time);

time: 时间以三个字节的整数形式提供,从最高有效字节开始,表示自午夜以来的1/100秒。

我不知道如何做到这一点。我可以用毫秒(Sysem.currentTimeInMillisecond)获取时间。但是这给出的是自1970年1月1日以来过去的毫秒数。

有人能帮忙吗?

3个回答

2

简而言之

ZonedDateTime.now( 
    ZoneId.of( "Africa/Tunis" ) 
)
.get( ChronoField.MILLI_OF_DAY )  
/ 10L 

java.time

现代的方法使用 java.time 类,取代了麻烦的旧遗留类,如 DateCalendar

时区对于确定当前日期和时间非常重要。

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

获取当天的第一个时刻。
ZonedDateTime startOfToday = now.toLocalDate().atStartOfDay( z ) ;

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

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

获取该时间段内的毫秒数。
long millis = d.toMillis() ;

但你需要的是1/100秒的精度,而不是1毫秒的1/1,000秒精度。因此请除以十。

long countOfOneHundrethsOfASecondSinceStartOfDay = ( millis / 10L ) ;

可以通过访问ZonedDateTime对象的MILLI_OF_DAY字段来快速获取,无需获取一天的开始。

ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ) ) ;
long millis = now.get( ChronoField.MILLI_OF_DAY ) ; 
long countOfOneHundrethsOfASecondSinceStartOfDay = ( millis / 10L ) ;

关于 java.time

java.time 框架内置于 Java 8 及以上版本。这些类替代了麻烦的旧式日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到 java.time 类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和说明。规范是JSR 310

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

在哪里获取 java.time 类?

ThreeTen-Extra项目添加了Java.time的其他类。该项目是Java.time未来可能添加的新功能的试验场。您可能会在此处找到一些有用的类,例如IntervalYearWeekYearQuarter更多


2

这是我刚写的代码。我认为它已经足够自我说明了。将 int 转换为字节数组的逻辑来自于 DataOutputStream.writeInt()

    Calendar c = Calendar.getInstance(); //now

    Calendar m = Calendar.getInstance(); //midnight
    m.set(Calendar.HOUR_OF_DAY, 0);
    m.set(Calendar.MINUTE, 0);
    m.set(Calendar.SECOND, 0);
    m.set(Calendar.MILLISECOND, 0);

    int diff = (int) (c.getTimeInMillis() - m.getTimeInMillis()) ;
    int v = diff / 10;

    byte[] bytes = new byte[4];
    bytes[0] = (byte) ((v >>> 24) & 0xFF);
    bytes[1] = (byte) ((v >>> 16) & 0xFF);
    bytes[2] = (byte) ((v >>>  8) & 0xFF);
    bytes[4] = (byte) ((v >>>  0) & 0xFF);

0

创建一个公历日历。克隆它并将小时、分钟、秒和毫秒设置为零。获取两个日期的毫秒数并计算差值,然后转换为百分之一秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接