在使用SimpleDataFormat解析时间字符串时,我看到了一些让我感到困惑的输出。因此,考虑到以下情况:
public class NewMain
{
public static void main( String[] args )
{
String str1 = "00:00:03";
parseStr(str1);
String str2 = "-00:00:03";
parseStr(str2);
String str3 = "00:59:59";
parseStr(str3);
String str4 = "-00:59:59";
parseStr(str4);
String str5 = "01:00:00";
parseStr(str5);
String str6 = "-01:00:00";
parseStr(str6);
}
private static void parseStr(String aStr)
{
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Calendar cal = sdf.getCalendar();
Date date = cal.getTime();
System.out.println("SimpleDateFormat.getCalendar.getTime: " + date.toString());
try
{
Date dee = sdf.parse(aStr);
String dStr = dee.toString();
System.out.println("SimpleDateFormat.parse("+aStr+") = " + dStr);
}
catch (ParseException ex)
{
ex.printStackTrace();
}
System.out.println("");
}
}
和输出:
SimpleDateFormat.getCalendar.getTime: Sun Dec 08 10:00:28 CST 1940
SimpleDateFormat.parse(00:00:03) = Thu Jan 01 00:00:03 CST 1970
SimpleDateFormat.getCalendar.getTime: Sun Dec 08 10:00:28 CST 1940
SimpleDateFormat.parse(-00:00:03) = Thu Jan 01 00:00:03 CST 1970
SimpleDateFormat.getCalendar.getTime: Sun Dec 08 10:00:28 CST 1940
SimpleDateFormat.parse(00:59:59) = Thu Jan 01 00:59:59 CST 1970
SimpleDateFormat.getCalendar.getTime: Sun Dec 08 10:00:28 CST 1940
SimpleDateFormat.parse(-00:59:59) = Thu Jan 01 00:59:59 CST 1970
SimpleDateFormat.getCalendar.getTime: Sun Dec 08 10:00:28 CST 1940
SimpleDateFormat.parse(01:00:00) = Thu Jan 01 01:00:00 CST 1970
SimpleDateFormat.getCalendar.getTime: Sun Dec 08 10:00:28 CST 1940
SimpleDateFormat.parse(-01:00:00) = Wed Dec 31 23:00:00 CST 1969
前两个负数解析为给定时间,不带“-”。但是字符串“-01:00:00”解析为完全不同的时间。看起来解析器正在从1970年1月1日减去它。我很困惑,因为“-00:00:03”和“-00:59:59”没有这个效果!
任何帮助都将不胜感激!
2条答案
按热度按时间xnifntxz1#
java.time.duration文件
我同意sotirios delimanolis的假设,例如,字符串表示时间量,比如持续时间。在许多情况下,这可能是积极的,也可能是消极的。如果这个假设是正确的,使用
Duration
在 java 。一个限制
Duration
只有ISO8601格式的字符串可以直接解析为Duration
. 所以我使用正则表达式将字符串转换为ISO8601格式。使用此方法声明
main
方法打印:System.out.format("Duration.parse(%s) = %s%n%n", aStr, dur);
jm2pwxwz2#
负时间。
-00:59:59
没有道理。如果您的api从客户机应用程序获得了这样的时间,那么要么丢弃它,要么教育客户机应用程序的所有者纠正它。另一个选择是在删除负号后解析字符串。注意,api的日期时间
java.util
以及它们的格式化api,SimpleDateFormat
过时且容易出错。建议完全停止使用它们,并切换到现代日期时间api。输出:
在trail:date-time了解有关现代日期时间api的更多信息。
注意:无论出于何种原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。
如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。
下面给出了删除负号后如何解析字符串:
输出:
如果你是说
Duration
(可以是负数)而不是时间,检查Duration#toString
了解持续时间是如何表示的。使用旧api:
输出:
请注意,日期时间对象不存储格式信息。如果您希望以特定格式打印日期时间对象,可以使用格式化api(例如。
DateTimeFormatter
在现代api和SimpleDateFormat
在遗留api中)。这个LocalTime#toString
返回iso-8601格式的字符串HH:mm:ss
因此,如果它是预期的格式,则不需要使用DateTimeFormatter
.