2

我无法将时间字符串转换为准确的 Date 对象表示

我与之通信的服务器将提供这样的 UTC 时间值。

2013-01-02T05:32:02.8358602Z

当我尝试以下代码时,我得到的毫秒计数比预期的 UTC 提前了近 2 小时 15 分钟。

DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.getDefault());
inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));                   
Date date = inputFormat.parse("2013-01-02T05:32:02.8358602Z");

我究竟做错了什么

4

2 回答 2

0

问题是 SimpleDateFormat 需要 8358602 不是几分之一秒,如果millis = 8358602 ms,它就是数字。默认情况下,SimpleDateFormat 处于“宽松”模式,这就是它接受 8358602 的原因,它还将接受天字段中的 99 并将额外的天数移至月份字段等等。如果您将严格模式切换为 SimpleDateFormat.setLenient(true),您将收到 ParseException,因为 millis 的最大值为 999。

我可以提供一个解决方法。您的日期采用带有小数秒的 W3C XML Schema 1.0 日期/时间格式。对于这种情况,您需要 javax.xml.datatype.XMLGregorianCalendar。这有效

DatatypeFactory dtf = DatatypeFactory.newInstance();
XMLGregorianCalendar c = dtf.newXMLGregorianCalendar("2013-01-02T05:32:02.8358602Z");
System.out.println(c.toGregorianCalendar().getTime());

并打印

Wed Jan 02 07:32:02 EET 2013

请注意,EET 是 GMT+2

于 2013-01-02T06:51:43.273 回答
-1

试试这个:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date d = format.parse(fileDate);

必须在SimpleDateFormat()构造函数中指定正确的格式。

编辑:

public String getconvertdate1(String date)
{
    DateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    DateFormat outputFormat = new SimpleDateFormat("dd MMM yyyy");
    Date parsed = null; // should not be initialized first else current date will be printed in case of a parse exception
    try
    {
        parsed = inputFormat.parse(date);
    }
    catch (ParseException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String outputText = outputFormat.format(parsed);
    return outputText;
}

并用我上面的方法尝试这种格式:EEE MMM dd HH:mm:ss zzz yyyy

于 2013-01-02T06:23:36.480 回答