在Java中将String datetime转换为Date?

时间:2015-12-03 16:26:12

标签: java datetime

我正在尝试将这两个字符串转换为日期,并且我得到异常无法解析的日期。

“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);
    }

5 个答案:

答案 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.time

您正在使用的课程java.util.Date& java.text.SimpleDateFormat已被Java 8及更高版本中内置的新java.time框架取代。

新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial

java.time类支持nanosecond分辨率,最多9位小数秒。因此,在您输入的情况下不会丢失数据。

ISO 8601

您的两个String输入都采用ISO 8601标准定义的格式。

在解析或生成日期时间值的String表示时,java.time类默认使用ISO 8601。因此,我们可以指定一个预定义的格式化程序,而不是定义格式化程序模式。对于某些格式,我们甚至根本不需要指定格式化程序。

示例代码

你有两个输入字符串,所以有两个例子。

示例1

第一个字符串没有时区或偏离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

示例2

您的第二个字符串确实包含时区信息,其格式为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