2011-03-22 190 views
25

我想将时间戳2011-03-10T11:54:30.207Z转换为10/03/2011 11:54:30.207。我怎样才能做到这一点?我想将ISO8601格式转换为UTC,然后该UTC应该是位置感知的。请帮助如何将时间戳从yyyy-MM-ddThh:mm:ss:SSSZ格式转换为MM/dd/yyyy hh:mm:ss.SSS格式?从ISO8601到UTC

String str_date="2011-03-10T11:54:30.207Z"; 
DateFormat formatter ; 
Date date ; 
formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS"); 
date = (Date)formatter.parse(str_date); 
System.out.println("output: " +date); 

异常:java.text.ParseException:无法解析的日期: “2011-03-10T11:54:30.207Z”

回答

31

首先,你需要知道的是UTC是不是一个格式,这是一个时间段,有效。所以“从ISO8601转换到UTC”并不是真正意义上的概念。

但是,下面是一个使用Joda Time的示例程序,它将文本解析为DateTime并对其进行格式化。我猜想可能需要使用格式 - 你还没有真正提供足够的信息来说明你想要做什么来说更多。您可能还想考虑时区...您是否想要在指定时间显示本地时间?如果是这样,您需要制定出用户的时区并进行适当的转换。

import org.joda.time.*; 
import org.joda.time.format.*; 

public class Test { 
    public static void main(String[] args) { 
     String text = "2011-03-10T11:54:30.207Z"; 
     DateTimeFormatter parser = ISODateTimeFormat.dateTime(); 
     DateTime dt = parser.parseDateTime(text); 

     DateTimeFormatter formatter = DateTimeFormat.mediumDateTime(); 
     System.out.println(formatter.print(dt)); 
    } 
} 
+0

您好,我想知道“T”和“Z”代表什么? – 2015-06-29 05:12:45

+2

@KevinZhao:'T'只是将时间与日期分开的方式; 'Z'表示UTC作为时区的方式 - “祖鲁时间”。 – 2015-06-29 05:46:45

+0

谢谢。这真的帮了我最后的DateTimeFormatter解析器= ISODateTimeFormat.dateTime(); parsedDate = parser.parseDateTime(stringDate).toDate(); – 2016-09-21 00:09:59

-3

使用DateFormat。 (对不起,但简短的问题不能保证更长或更详细的答案。)

+0

对不起,任何不便。我得到 异常:java.text.ParseException:解析日期:“2011-03-10T11:54:30.207Z”错误请参阅我编辑过的问题。 – user617966 2011-03-22 16:20:55

0

输入原始日期到a Date object,然后打印出结果与a DateFormat。如果the automatic parse method不接受您的格式,则可能必须将字符串拆分为较小的部分以创建最初的对象Date

伪代码:

Date inputDate = convertYourInputIntoADateInWhateverWayYouPrefer(inputString); 
DateFormat outputFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss.SSS"); 
String outputString = outputFormat.format(inputDate); 
+0

我收到parseException – user617966 2011-03-22 16:14:52

+1

String str_date =“2011-03-10T11:54:30.207Z”; DateFormat格式化程序; 日期日期; formatter = new SimpleDateFormat(“dd/MM/yyyy hh:mm:ss.SSS”); date =(Date)formatter.parse(str_date); System.out.println(“output:”+ date); 异常:java.text.ParseException:Unparseable日期:“2011-03-10T11:54:30.207Z” – user617966 2011-03-22 16:15:10

+1

据我所知SimpleDateFormat不是线程安全的,如果您需要线程安全解决方案,请使用joda-time和使用[PeriodFormatterBuilder](http://joda-time.sourceforge.net/apidocs/org/joda/time/format/PeriodFormatterBuilder.html)构建格式化程序,并尽可能享受简单的日期处理。 – moritz 2011-03-22 16:21:04

0

你可能想看看joda time,这是一个小更容易比Java本地最新的工具来使用,并提供了许多常见的日期模式的预建。

在回应评论,更多详细信息:

要做到这一点使用约达时间,你需要两个DateTimeFormatters - 一个为你的输入格式解析您的输入和一个输出格式打印您的输出。你的输入格式是ISO标准格式,所以Joda时间的ISODateTimeFormat类已经有一个静态方法和一个解析器:dateHourMinuteSecondMillis。你的输出格式不是他们有预建格式器的格式,所以你必须使用DateTimeFormat自己创建一个。我认为DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS");应该做的伎俩。一旦你有两个格式化器,在输出格式上调用parseDateTime()方法,在输出格式上调用print方法,以字符串形式得到结果。

将其组合在一起应该是这个样子(警告,未经测试):

DateTimeFormatter input = ISODateTimeFormat.dateHourMinuteSecondMillis(); 
DateTimeFormatter output = DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS"); 
String outputFormat = output.print(input.parseDate(inputFormat)); 
+0

我得到 异常:java.text.ParseException:Unparseable日期:“2011-03-10T11:54:30.207Z”错误看到我编辑的问题。 – user617966 2011-03-22 16:21:51

+0

我已经下载了乔达时间,但不知道如何将ISO8601转换为UTC格式。请指导 – user617966 2011-03-22 18:01:09

+0

@ user617966:UTC不是格式,它是一个时区(有效)。 – 2011-03-22 18:16:47

28

是的。你可以像这样使用SimpleDateFormat。

SimpleDateFormat formatter, FORMATTER; 
formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
String oldDate = "2011-03-10T11:54:30.207Z"; 
Date date = formatter.parse(oldDate.substring(0, 24)); 
FORMATTER = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS"); 
System.out.println("OldDate-->"+oldDate); 
System.out.println("NewDate-->"+FORMATTER.format(date)); 

输出 OldDate - > 2011-03-10T11:54:30.207Z NewDate - > 10-MAR-2011 11时54分三十秒。207

+2

正面朝上,小写'hh'是12小时格式,'HH'是24小时 – 2017-06-29 15:53:42

0

希望这有助于:

public String getSystemTimeInBelowFormat() { 
    String timestamp = new SimpleDateFormat("yyyy-mm-dd 'T' HH:MM:SS.mmm-HH:SS").format(new Date()); 
    return timestamp; 
} 
相关问题