如何正确地将时间字符串转换为日期对象

时间:2013-01-02 06:22:23

标签: java android epoch

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

我正在与之通信的服务器将提供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");

我做错了什么

2 个答案:

答案 0 :(得分:0)

问题是,如果millis = 8358602 ms,SimpleDateFormat需要8358602不是一小部分,那么它就是数字。默认情况下,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

答案 1 :(得分:-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