Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将时间字符串正确转换为日期对象_Java_Android_Epoch - Fatal编程技术网

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

Java 如何将时间字符串正确转换为日期对象,java,android,epoch,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.getTim

将时间字符串转换为准确的日期对象表示时遇到问题

我正在与之通信的服务器将提供如下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");
我做错了什么

试试这个:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date d = format.parse(fileDate);
必须在SimpleDataFormat()构造函数中指定正确的格式

编辑:

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
尝试一下:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
Date d = format.parse(fileDate);
必须在SimpleDataFormat()构造函数中指定正确的格式

编辑:

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

问题是SimpleDateFormat需要8358602的时间不是一秒的小数,如果毫秒=8358602毫秒,它就是数字。默认情况下,SimpleDateFormat处于“宽松”模式,这就是它接受8358602的原因,它还将接受99天字段,并将额外的天移到月份字段,以此类推。如果您将严格模式切换为SimpleDataFormat.setLenient(true),您将得到ParseException,因为毫秒的最大值是999

我可以提供一个解决办法。您的日期采用W3CXMLSchema 1.0日期/时间格式,带有小数秒。在本例中,javax.xml.datatype.xmlgoriancalendar是您所需要的。这很有效

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

问题是SimpleDataFormat需要8358602不是一秒的小数点,如果毫秒=8358602毫秒,它就是数字。默认情况下,SimpleDataFormat处于“宽松”模式,这就是它接受8358602的原因,它还将接受99天字段,并将额外的天移到月字段,依此类推。如果您将严格模式切换为SimpleDataFormat.setLenient(true),您将得到ParseException,因为毫秒的最大值是999

我可以提供一个解决办法。您的日期采用W3CXMLSchema 1.0日期/时间格式,带有小数秒。在本例中,javax.xml.datatype.xmlgoriancalendar是您所需要的。这很有效

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

不幸的是,它抛出了一个解析异常。Jayamohan….@Redshirt,我已经发布了另一个答案,请参阅,编辑。我使用输入getconvertdate1(“2013-01-02T05:32:02.8358602Z”)调用了您的方法;我仍然在获取java.text.parseexception在使用已编辑的答案时,将“T”添加到inputFormat是有效的。与我现在的代码相比,您的代码中唯一真正的区别在于,您在为日期对象赋值之前实例化了它。。。我不想试着找出原因,只是很高兴它能工作。@Jayamohan:你看不到上面指定的格式吗…它是“EEE-MMM-dd-HH:mm:ss-zzz-yyyy”,而你指定的是“yyyy-mm-dd-HH:mm:ss”,我想……你可以按照你的日期模式,为此你必须在SimpleDateFormat()的构造函数中指定正确的格式…不幸的是,这抛出了一个解析异常。Jayamohan,我曾经处理过这个问题。@Redshirt,我发布了另一个答案,请参见,编辑。我用输入getconvertdate1(“2013-01-02T05:32:02.8358602Z”)调用了您的方法;我仍然在获取java.text.parseexception在使用已编辑的答案时,将“T”添加到inputFormat是有效的。与我现在的代码相比,您的代码中唯一真正的区别在于,您在为日期对象赋值之前实例化了它。。。我不想试着找出原因,只是很高兴它能工作。@Jayamohan:你看不到上面指定的格式吗…它是“EEE-MMM-dd-HH:mm:ss-zzz-yyyy”,而你指定的是“yyyy-mm-dd-HH:mm:ss”,我想……你可以按照你的日期模式,为此你必须在SimpleDateFormat()的构造函数中指定正确的格式…谢谢你的解释。谢谢你的解释。可能是重复的谢谢你建议的链接,但我不相信它是重复的。我不是想提高可读性,而是想准确地将字符串转换为日期。可能是重复的,谢谢你推荐的链接,但我不相信它是重复的。我不是想提高可读性,而是想将字符串准确地转换为日期。