我正在使用一个Java库,其中有一个需要时间信息的方法。它被描述为:
public void function(byte[] time);
time: 时间以三个字节的整数形式提供,从最高有效字节开始,表示自午夜以来的1/100秒。
我不知道如何做到这一点。我可以用毫秒(Sysem.currentTimeInMillisecond)
获取时间。但是这给出的是自1970年1月1日以来过去的毫秒数。
有人能帮忙吗?
ZonedDateTime.now(
ZoneId.of( "Africa/Tunis" )
)
.get( ChronoField.MILLI_OF_DAY )
/ 10L
现代的方法使用 java.time 类,取代了麻烦的旧遗留类,如 Date
和 Calendar
。
时区对于确定当前日期和时间非常重要。
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 8 及以上版本。这些类替代了麻烦的旧式日期时间类,如java.util.Date
、Calendar
和 SimpleDateFormat
。
现在处于维护模式的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未来可能添加的新功能的试验场。您可能会在此处找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和更多。
这是我刚写的代码。我认为它已经足够自我说明了。将 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);
创建一个公历日历。克隆它并将小时、分钟、秒和毫秒设置为零。获取两个日期的毫秒数并计算差值,然后转换为百分之一秒。