将格式为1/1/2010 3:23:12 PM +00:00的字符串模式转换为Java.util.Date

时间:2019-05-28 22:17:12

标签: java date

我正在尝试将格式为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的时间

2 个答案:

答案 0 :(得分:2)

OffsetDateTime是您要寻找的。

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相同的一个小时;
  • 您将AM / PM与24小时制的格式说明符(H)结合使用;您应该改用h

我不确定SimpleDateFormat如何处理字符串的时区部分,但是没有给出时区的格式说明符。

这就是为什么我喜欢这个Date and Time API的原因之一:它非常简单。

答案 1 :(得分:0)

  

无法将字符串格式转换为Java日期。它不是   将时间标识为AM/PM

您在问不可能的事。 Date是一个时间点(在内部实现为自所谓的纪元以来的毫秒数),因此它“不了解”您所在时区的AM和PM。

这是一样的,因为Date类的设计总是很差,很幸运,它已经过时了。您完全不应该使用它。

java.time

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对不解析所有字符串感到满意)。

链接