我正在尝试将格式为1/1/2010 3:23:12 PM +00:00
的字符串转换为Java.util.Date
无法将字符串格式转换为Java日期。
它不能将时间标识为AM/PM
String s = "1/1/2010 3:23:12 PM +00:00";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss a",Locale.ENGLISH);
Date date = sdf.parse(s));
需要将日期转换为标识为AM/PM
的时间
答案 0 :(得分:2)
OffsetDateTime
是您要寻找的。 p>
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy h:mm:ss a XXX");
OffsetDateTime time = OffsetDateTime.parse(str, formatter);
System.out.println(time);
您的模式有一些问题:
dd
; MM
相同的月份; HH
相同的一个小时; H
)结合使用;您应该改用h
。我不确定SimpleDateFormat
如何处理字符串的时区部分,但是没有给出时区的格式说明符。
这就是为什么我喜欢这个Date and Time API的原因之一:它非常简单。
答案 1 :(得分:0)
无法将字符串格式转换为Java日期。它不是 将时间标识为
AM/PM
您在问不可能的事。 Date
是一个时间点(在内部实现为自所谓的纪元以来的毫秒数),因此它“不了解”您所在时区的AM和PM。
这是一样的,因为Date
类的设计总是很差,很幸运,它已经过时了。您完全不应该使用它。
java.time(我们应该使用现代Java日期和时间API代替Date
)更接近满足您的要求。 MC Emperor已经显示了解析日期时间字符串所需的基本代码。他的代码输出为:
2010-01-01T15:23:12Z
这里没有AM或PM。当我们以这种方式打印OffsetDateTime
时,其toString
方法被隐式调用。它产生一个ISO 8601格式的字符串。 ISO 8601规定了24小时制(无AM或PM)。 但是!。在正确的TemporalField
对象的协助下,OffsetDateTime
可以计算并返回AM还是PM。 time.get(ChronoField.AMPM_OF_DAY)
对于AM返回0,对于PM返回1:
System.out.println("AM or PM? 0 for AM. 1 for PM. time: "
+ time.get(ChronoField.AMPM_OF_DAY));
上午还是下午?对于AM为0。下午1点。时间:1
因此,在这种情况下,由于您的原始字符串中包含PM
,因此我们期望的PM为1。
我故意没有回答您的所有问题,因为其他Stack Overflow问题及其答案中已经涵盖了大部分问题。因此最好将信息保留在那里。我在下面提供了一些相关问题的链接。
您的代码中至少存在两个错误,每个错误都会导致您得到错误的结果。我尝试在America / Los_Angeles时区运行您的代码,并得到
2010年1月1日星期五01:03:23
打印的时间是24小时制(Date
总是这样做),所以我们的时间是上午03:23:12,而不是下午。我们将时间设为默认时区(PST为太平洋标准时间),因此该时间点对应于字符串中的偏移量+00:00处的11:23:12 AM。
HH
是一天中从00到23的时间,因此3
表示03 AM,显然是“胜出”(在AM或PM的一个小时内,从1点到12点,您将需要小写的h
)。SimpleDateFormat
对不解析所有字符串感到满意)。