Java SimpleDataFormat解析像美国/洛杉矶这样的时区
我想用Java解析以下字符串并将其转换为日期: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
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);