我正在尝试将这两个字符串转换为日期,并且我得到异常无法解析的日期。
“2015-12-03T15:00:08.868987”和“2015-12-03T17:00:08Z”。这两种格式 “yyyy-MM-dd'T'HH:mm:ss.SSSXXX”和“yyyy-MM-dd'T'HH:mm:ss.SSSZ”
String s = "2015-12-03T17:00:08Z";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
try
{
Date date = simpleDateFormat.parse(s);
System.out.println("date : "+simpleDateFormat.format(date));
}
catch (ParseException ex)
{
System.out.println("Exception "+ex);
}
答案 0 :(得分:4)
原因是你使用了错误的格式,这里Z代表时区
String s = "2013-09-29T18:46:19-0700";
SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
如果时间格式在上面,它将正常工作。 如果你只用单引号标记Z,它只会被视为一个字符串,而不是解析它。
编辑: - 如果你想使用“2015-12-03T15:00:08.8689870”,那么模式必须是yyyy-MM-dd'T'HH:mm:ss.SSS
String s = "2015-12-03T15:00:08.8689870";
SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
如果日期时间是2015-12-03T17:00:08Z,则可以使用模式yyyy-MM-dd'T'HH:mm:ssX,其中X表示ISO 8601时区.JavaDateFormat的Java 7版本使用大写字母X支持ISO-8601时区。
String s = "2015-12-03T17:00:08Z";
SimpleDateFormat inFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
Date dtIn = inFormat.parse(s);
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
如果你坚持使用Java 6或更早版本,推荐JodaTime的答案是安全的。
String timestamp = "2011-04-15T20:08:18Z";
DateTime dateTime = ISODateTimeFormat.dateTimeParser().parseDateTime(timestamp);
这正确识别UTC时区,然后允许您使用Joda Time的广泛操作方法来获取您想要的内容。
答案 1 :(得分:1)
String s = "2015/12/03/17:00:34";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/HH:mm:ss");
try
{
Date date = simpleDateFormat.parse(s);
System.out.println("date : "+simpleDateFormat.format(date));
}
catch (ParseException ex)
{
System.out.println("Exception "+ex);
}
修改与SimpleDateFormat相同的字符串日期。
答案 2 :(得分:0)
更改
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
到
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
答案 3 :(得分:0)
Pojava DateTime库(在Maven Central Repo中)将解析这两个日期而无需指定格式。
Date d1 = DateTime.parse("2015-12-03T15:00:08.868987").toDate();
Date d2 = DateTime.parse("2015-12-03T17:00:08Z").toDate();
System.out.println(d1); // Thu Dec 03 15:00:08 PST 2015
System.out.println(d2); // Thu Dec 03 09:00:08 PST 2015
答案 4 :(得分:0)
您正在使用六位小数秒来解析字符串输入,这意味着microsecond。
您使用的旧java.sql.Date类仅支持毫秒(3位数)。因此,即使您设法解析该输入,您也会丢失一些信息。
您正在使用的课程java.util.Date
& java.text.SimpleDateFormat
已被Java 8及更高版本中内置的新java.time框架取代。
新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial。
java.time类支持nanosecond分辨率,最多9位小数秒。因此,在您输入的情况下不会丢失数据。
您的两个String输入都采用ISO 8601标准定义的格式。
在解析或生成日期时间值的String表示时,java.time类默认使用ISO 8601。因此,我们可以指定一个预定义的格式化程序,而不是定义格式化程序模式。对于某些格式,我们甚至根本不需要指定格式化程序。
你有两个输入字符串,所以有两个例子。
第一个字符串没有时区或偏离UTC信息。因此,我们必须指定一个时间来解释该输入的含义。我假设你的意图是UTC。我们通过调用withZone
将UTC指定为时区。
该时区也被指定为ZonedDateTime
对象的时区。换句话说,没有进行进一步的时区调整。
String input = "2015-12-03T15:00:08.868987";
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone ( ZoneOffset.UTC );
ZonedDateTime zdt = ZonedDateTime.parse ( input , formatter );
zdt:2015-12-03T15:00:08.868987Z
您的第二个字符串确实包含时区信息,其格式为Z
,代表Zulu
,表示UTC
。
java.time框架提供Instant
类来表示UTC时间轴上的时刻。您可以将ZonedDateTime
视为Instant
加上时区(ZoneId
)。
因为第二个字符串是(a)在UTC时区,而(b)是ISO 8601格式,所以我们不需要指定任何格式化程序。 Instant
类可以直接解析这样的String。
String input = "2015-12-03T17:00:08Z";
Instant instant = Instant.parse ( input );
转储到控制台。
System.out.println ( "instant: " + instant );
时刻:2015-12-03T17:00:08Z