Java中的Unparsable日期:SimpleDateFormat的基本日历实例分析问题
我想将当前时间和日期解析为这种简单的日期格式。Java中的Unparsable日期:SimpleDateFormat的基本日历实例分析问题
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy-kk:mm");
Date datetoday = sdf.parse(Calendar.getInstance().getTime().toString());
但是,我明白了。
java.text.ParseException:无法解析的日期: “周二5月17日15时28分36秒CDT 2016”
我仍然能够解析字符串一样:10/10/1991年至1912年:00但是当给定日历实例,它会爆炸。我真的应该已经使用JodaTime从开始。
我该如何获得当前时间,直接进入SimpleDateFormat?据我了解,SimpleDateFormat将接收字符串,并在其能够解析它时将其转换为日期。解析将会看到,Tue会进入SDF中的ddd区域,并且如果我将进入MMM有一个简单的日期格式。我不。我有MM,所以它炸毁了。我可以在输入中输入一个M/d/yyyy,所以我最终给出了M,同时请求了MM,这仍然有效。
我是否应该放弃一切,并与JodaTime或有一两行我失踪?
这是你如何获得表示为一个Java Date对象当前日期:
Date date = new Date();
这是你如何获得当前日期为格式的字符串:
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy-kk:mm");
String formattedDateString = sdf.format(new Date());
然后,您可以进一步分析它回到日期:
Date date = sdf.parse(formattedDateString);
但这样做没有意义,因为你alr伊迪有日期,当你做了.format(...)调用,只有在你的情况,你所用
Calendar.getInstance().getTime()
如果你想解析,它通常具有相同的结果
new Date()
字符串转换为日期,那么字符串需要与SimpleDateFormat构造函数中指定的格式匹配。您正在使用的Date的toString()方法以特定的格式返回一个字符串,与您的示例中的格式不匹配,这就是您得到ParseException错误的原因。
字符串!=日期 - 时间
不要混淆一个日期时间对象与表示其值的String。
您应该尽可能使用对象。生成一个字符串仅用于呈现给用户。使用字符串与其他软件交换数据时,请仅使用ISO 8601格式。
java.time
的问题和接受的答案都使用麻烦的旧的遗留日期时间类,现在由java.time类取代。
您的输入格式不是标准的,而且容易混淆。这是-12:00
结束时区或时间?我会猜测一天的时间。这个猜测意味着输入缺少任何关于从UTC或时区偏移的指示。所以我们解析为LocalDateTime
对象。
String input = "5/5/1991-12:00"
DateTimeFormatter f = DateTimeFormatter.ofPattern("M/d/uuuu-HH:mm");
LocalDateTime ldt = LocalDateTime.format(input , f);
ldt.toString():1991-05-05T12:00
甲LocalDateTime
对象故意缺乏任何offset-from-UTC或时区。这意味着它不是而是代表了时间轴上的一个时刻,只是关于可能时刻的一个粗略想法。你必须指定一个时区来赋予其含义。
如果您的建议上下文表明该输入是为了在UTC,应用不断ZoneOffset.UTC
得到一个OffsetDateTime
。
OffsetDateTime odt = ldt.atOffset (ZoneOffset.UTC);
odt.toString():1991-05-05T12:00Z
在标准ISO 8601字符串的结尾的Z
是短期的和Zulu
UTC。
另一方面,如果上下文指示特定时区,请应用ZoneId
以获得ZonedDateTime
。什么时区用于您的示例输入字符串?你是指新西兰奥克兰中午,巴黎中午中午或加拿大魁北克蒙特利尔中午?
ZoneId z = ZoneId.of ("America/Montreal");
ZonedDateTime zdt = ldt.atZone (z);
zdt.toString():1991-05-05T12:00-04:00 [美国/蒙特利尔]
关于java.time
的java.time框架内置到Java 8和更高版本。这些课程取代了麻烦的旧日期时间课程,如java.util.Date
,.Calendar
,& java.text.SimpleDateFormat
。
Joda-Time项目现在位于maintenance mode,建议迁移到java.time。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。
大部分的java.time功能后移植到Java 6 和ThreeTenABP还适于Android(见How to use…)。
ThreeTen-Extra项目扩展java.time与其他类。这个项目是未来可能增加java.time的一个试验场。你可以在这里找到一些有用的类,如Interval
,YearWeek
,YearQuarter
,等等。
我不明白。如果你有一个'Calendar'实例,你可以直接从它得到'Date'。为什么你需要将它转换为一个字符串并解析该字符串? –
JodaTime?不,你应该使用JDK 8和java.time包。 – duffymo
我不清楚。我有一个日期遵循MM-dd-yyyy的格式,我想将它与当前日期进行比较,而日历实例不遵循该格式,因此无法进行比较。 – Jayizzle