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或有一两行我失踪?

+4

我不明白。如果你有一个'Calendar'实例,你可以直接从它得到'Date'。为什么你需要将它转换为一个字符串并解析该字符串? –

+1

JodaTime?不,你应该使用JDK 8和java.time包。 – duffymo

+0

我不清楚。我有一个日期遵循MM-dd-yyyy的格式,我想将它与当前日期进行比较,而日历实例不遵循该格式,因此无法进行比较。 – Jayizzle

这是你如何获得表示为一个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是短期的和ZuluUTC

另一方面,如果上下文指示特定时区,请应用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,等等。