谢谢!
谢谢!
Duration.between (
LocalTime.MIN ,
LocalTime.parse ( "08:30:00" )
).toString()
PT8H30M
如果你用字符串08:30:00
表示“八个半小时”时间跨度,则不要使用术语“时间戳”。正确且常用的词是“持续时间”。避免使用HH:MM:SS格式,因为它太模糊了,看起来像是一天中的时间。而应该使用下面讨论的标准格式。
如果你用字符串08:30:00
表示“早上八点半”,则使用“时间戳”这个词并避免使用“持续时间”这个术语。
这是两个非常不同的概念。你必须清楚地理解它们,每个概念在你的脑海中应该是独立的。使用HH:MM:SS这种模糊的格式会使这种区别更加困难(所以避免使用这种格式!)。
现代方法是使用java.time类。
LocalTime
正如Sharma在评论中提到的那样,首先将你的字符串解析为LocalTime
。这个类表示一天中的时间,没有日期和时区。没有时区意味着这些对象基于通用的24小时时钟,不考虑例如夏令时(DST)等异常情况。
我们实际上不需要一个LocalTime
,因为你的输入字符串表示一个时间跨度而不是一天中的时间。但这只是第一步。
LocalTime lt = LocalTime.parse ( "08:30:00" );
持续时间
为了表示所需的时间跨度,我们需要使用Duration
类。该类用于没有与时间轴相关联的时间跨度。我们可以通过从时钟开始的时间量00:00:00.0
或LocalTime.MIN
和我们刚刚实例化的lt
来创建一个时间跨度。
Duration d = Duration.between ( LocalTime.MIN , lt );
我们可以通过调用Duration::toString
方法生成标准的ISO 8601持续时间格式字符串来查看结果。java.time类在解析/生成字符串时默认使用ISO 8601。对于持续时间,标准格式为PnYnMnDTnHnMnS
,其中P
表示开始,T
分隔年月日部分和时分秒部分。因此,我们的8个半小时将显示为PT8H30M
。
System.out.println("d.toString(): " + d);
d.toString(): PT8H30M
处理这样的持续时间值,我强烈建议在您的Java代码中使用Duration
对象,在序列化为文本时使用ISO 8601格式。
08:30:00
这样的内容容易被误读为一天中的时间。您希望使用小数表示,如8.5
,是有歧义的(很容易失去其含义)。此外,当使用浮点类型(float
、Float
、double
、Double
)时,小数类型会产生多余的错误数字。浮点技术特意放弃精度以获得执行速度。
BigDecimal
如果您必须使用分数,并且需要准确性,请使用BigDecimal
类。
在本例中,假设您想要小时和分钟,同时舍去任何小数部分的分钟。因此,我对Duration
调用了toMinutes
方法。
BigDecimal minutesPerHour = new BigDecimal ( 60L ); // Use var/constant for clarity of your intent.
BigDecimal minutes = new BigDecimal ( d.toMinutes () );
BigDecimal fractionalHours = minutes.divide ( minutesPerHour );
frationalHours.toString(): 8.5
您可以在IdeOne.com上查看此示例代码。
如果您坚持使用这些小数而不是Duration
对象和ISO 8601文本,则可能需要使用BigDecimal
功能进行舍入。
java.time框架内置于Java 8及更高版本中。这些类取代了老旧的、麻烦的日期时间类,如java.util.Date
、Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow上搜索许多示例和说明。规范是JSR 310。
在哪里获取java.time类?
ThreeTen-Extra项目通过添加额外的类来扩展java.time。该项目是java.time可能未来添加的新功能的试验场。您可以在此处找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
等等。
String[] a = "08:30:00".split(":");
double d = Integer.parseInt(a[0]) + Integer.parseInt(a[1]) / 60.0;
String.split()
来完成这个任务。它会根据你在参数中指定的正则表达式/分隔符将其拆分为数组。就像这样,String time = "08:30:00";
String[] splitValues = time.split(":");
double hour = splitValue[0];
double minute = splitValue[1];
double seconds = splitValue[2];
然后您可以将这些值相加。您知道一小时有60分钟,一分钟有60秒。您可以通过分别除以60和3600将它们转换为小时。然后,只需要简单地进行加法运算即可。