如何将时间戳从yyyy-MM-ddThh:mm:ss:SSSZ格式转换为MM / dd / yyyy hh:mm:ss.SSS格式?从ISO8601到UTC

时间:2011-03-22 15:44:00

标签: java datetime

我想将时间戳2011-03-10T11:54:30.207Z转换为10/03/2011 11:54:30.207。我怎样才能做到这一点?我想将ISO8601格式转换为UTC,然后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”

6 个答案:

答案 0 :(得分:31)

首先,您需要注意UTC不是一种格式,它是一个有效的时区。因此,“从ISO8601转换为UTC”作为一个概念并不真正有意义。

但是,这是一个使用Joda Time的示例程序,它将文本解析为DateTime然后对其进行格式化。我已经猜到了你可能想要使用的 a 格式 - 你还没有真正提供足够的信息来说明你要做的事情不仅仅是这些。您可能还想考虑时区...是否要在指定时刻显示本地时间?如果是这样,您需要计算用户的时区并进行适当的转换。

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));
    }
}

答案 1 :(得分:29)

是。你可以像这样使用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:30.207

答案 2 :(得分: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);

答案 3 :(得分:0)

您可能希望查看joda time,它比java本机日期工具更容易使用,并提供了许多预先构建的常见日期模式。

回应评论,更多细节:

要使用Joda时间执行此操作,您需要两个DateTimeFormatters - 一个用于输入格式来解析输入,另一个用于输出格式以打印输出。您的输入格式是ISO标准格式,因此Joda time的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) );

答案 4 :(得分:0)

希望这有助于:

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

答案 5 :(得分:-3)

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