java.util.Date
import org.joda.time.DateTime;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
String dt = "2011-06-11T12:00:00Z";
String format = "yyyy-MM-dd'T'hh:mm:ss'Z'";
DateFormat df = new SimpleDateFormat(format);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date d = df.parse(dt);
DateTime joda = new DateTime(dt);
// Output Sat Jun 11 05:00:00 PDT 2011
System.out.println(joda.toDate());
// Output Fri Jun 10 17:00:00 PDT 2011
System.out.println(d);
}
}
jodaDateTime进行的,我遇到了一个有趣的情况:
2011-06-11T01:00:00Z
我想知道这是一个错误还是我错过了这里重要的东西?
我认为这是因为Joda和Java日期格式在12小时的演示中对待“ 12”。 其中一个将其视为午夜,而另一个则将其视为中午。
hh
的输入将证明我的假设。
yyyy-MM-dd'T'HH:mm:ss'Z'
用于小时字段,这意味着12小时格式。 因此,他们以不同的方式解释“ 12”:12小时格式将其视为中午,而24小时将其视为中午。
最新的更改是将格式更改为使用24小时演示文稿的格式,然后两者都可以正常工作。
您正在尝试将文字解析为文字
Z
,而不是时区偏移。 'Z'
(可能是的缩写
Z
)指定了零时区的偏移,+00:00
与了解更多有关它的信息不同。
我应该用什么符号来解析区域偏移字符串?
您应该使用
XXX
来解析不在默认格式的偏移日期字符串中的区域偏移。
区域偏移格式的示例Pattern
'Z'
Z
-08
检查XXX
。任何新代码都应使用你不需要java.time
X | |
---|---|
X |
-0830 |
XX |
-08:30 |
文献以了解有关它的更多信息。 | |
在2014年3月,Java 8推出了现代的日期API,该API取代了Error prone legacy date timeapi | XXXXX api. |
java.time
以默认格式(基于ISO8601
java.util
。 您甚至可以直接将其解析为
java.time
DateTimeFormatter
(即不明确使用
2011-06-11T12:00:00Z
)。
注:Instant#parse
不是一个真实的日期对象;它仅代表了时代的毫秒数(1970年1月1日,00:00:00 GMT)。
DateTimeFormatter
函数使用JVM的默认时区域形成日期时间字符串。 demo:
OffsetDateTime
ZonedDateTime
在线演示note
:由于某种原因,如果您需要一个实例
DateTimeFormatter
,请让java.util.Date
API执行解析日期时间字符串的繁重举重,并且可以使用Date#toString
.。 了解更多有关现代日期API的
trail:datetime.。