将字符串值转换为日期对象时输出不匹配

时间:2015-03-31 08:05:43

标签: java

我试图将字符串值转换为日期对象。我尝试了一些逻辑,但它没有用。看我的代码:

public class Test {     
    public static void main(String[] args) {
        try{
            Test obj= new Test();
            String date="2015-03-30T11:54:46.162430057Z";
            Date dt=obj.getServerDate(date);
            //System.out.println(dt);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    public Date getServerDate(String str_date)
    {
        if (str_date == null)
            return null;
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        System.out.println("Given date:" + str_date);

        Date pars_date = null;
        try 
        {
            pars_date = fmt.parse(str_date);
            System.out.println("Parsed date:" + pars_date);
        } 
        catch (Exception e) 
        {   
            e.printStackTrace();
        }

        return pars_date;    
    }    
}

上面的代码给出了以下输出:

Given date:2015-03-30T11:54:46.162430057Z
Parsed date:Wed Apr 01 09:01:56 IST 2015

在输出中,给定日期和解析日期不匹配,我在代码中找不到任何错误。如果您找到解决方案,请告诉我......

提前致谢。

1 个答案:

答案 0 :(得分:1)

问题在于将服务器格式与解析格式相匹配。

指定.SSS来处理毫秒,但在默认配置中,指定" S"没关系,SimpleDateFormat将消耗到下一个分隔符。这意味着它将解析第一个字段,最后添加162430057毫秒(约45小时),这将使您获得(正确但不需要的和意外的)2015年4月1日09:01:56 IST 2015.

如果您使用的是Java 8,我建议改为查看可以处理纳秒的DateTimeFormatter,或者在Java 8之前使用Joda Time

如果您运行的是JDK 1.3(根据供应商提供的是2006/2007生命终止版)并且您确定时间格式,那么您可以使用:

fmt(text.substring(0, 23) + 'Z')

或可能删除+ 'Z'并从格式中删除'Z'

使用日期,在任何情况下都会失去纳秒精度,因为日期只有毫秒。

相关问题