Java SimpleDataFormat解析像美国/洛杉矶这样的时区

Java SimpleDataFormat解析像美国/洛杉矶这样的时区,java,parsing,timezone,Java,Parsing,Timezone,我想用Java解析以下字符串并将其转换为日期: DTSTART;TZID=America/Los_Angeles:20140423T120000 我试过这个: SimpleDateFormat sdf = new SimpleDateFormat("'DTSTART;TZID='Z':'yyyyMMdd'T'hhmmss"); Date start = sdf.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000"); 这是: Sim

我想用Java解析以下字符串并将其转换为日期:

DTSTART;TZID=America/Los_Angeles:20140423T120000
我试过这个:

SimpleDateFormat sdf = new SimpleDateFormat("'DTSTART;TZID='Z':'yyyyMMdd'T'hhmmss");
Date start = sdf.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000");
这是:

SimpleDateFormat sdf = new SimpleDateFormat("'DTSTART;TZID='z':'yyyyMMdd'T'hhmmss");
Date start = sdf.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000");
但它仍然不起作用。我认为问题出在美国/洛杉矶。 你能帮我吗

谢谢你

用这个试试

注意:在执行此操作之前,必须拆分日期字符串

    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'hhmmss");

    TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
    sdf.setTimeZone(tz);

    Date start = sdf.parse("20140423T120000");

SimpleDateFormat
模式
Z
中表示
rfc822 4位时区


有关更多信息,请查看。

如果您正在寻找一种解决方案,如何在一个步骤中解析整个给定字符串,则提供此选项(模式符号V
SimpleDataFormat
中不受支持):


也许这是工作,但这不是我需要的。因为我得到一个字符串,比如:DTSTART;TZID=美国/洛杉矶:20140423T120000。我只能在首先解析字符串的情况下使用我们的解决方案,而不是使用子字符串等等。“我在寻找更快的东西。”LorenzoTassone你过早地优化了,这是一个糟糕的做法。Java非常快。拆分和解析字符串是一个合适的解决方案。仅供参考,有严重缺陷的日期-时间类,如和
java.text.simpleDataFormat
,现在被java 8和更高版本中内置的类所取代。这个答案应该是可以接受的,因为它使用java 8的时间API。为什么两次使用V,一次也没有?@行,因为CLDR标准只定义了两个字母VV作为有效符号(以及
java.time
——设计师决定在大多数部分遵循它)。类的javadoc引用:
ZoneId:输出时区ID,如“Europe/Paris”。如果字母数为2,则输出时区ID。任何其他字母计数都会引发IllegalArgumentException
// V = timezone-id, HH instead of hh for 24-hour-clock, u for proleptic ISO-year
DateTimeFormatter dtf = 
  DateTimeFormatter.ofPattern("'DTSTART;TZID='VV:uuuuMMdd'T'HHmmss");
ZonedDateTime zdt = 
  ZonedDateTime.parse("DTSTART;TZID=America/Los_Angeles:20140423T120000", dtf);
Instant instant = zdt.toInstant();

// if you really need the old class java.util.Date
Date jdkDate = Date.from(instant);