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

26

我想将时间戳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个回答

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

你好,我想知道"T"和"Z"代表什么? - Kevin Zhao
2
@KevinZhao:“T”只是将时间与日期分开的方式;“Z”是指示UTC作为时区的方式 - “Zulu时间”。 - Jon Skeet
谢谢。这个真的帮了我很多。最终的DateTimeFormatter解析器为ISODateTimeFormat.dateTime(); 解析后的日期为parsedDate = parser.parseDateTime(stringDate).toDate(); - Lyju I Edwinson

31
是的,你可以像这样使用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));

输出 旧日期-->2011-03-10T11:54:30.207Z 新日期-->10-Mar-2011 11:54:30.207


2
注意,小写的 hh 表示12小时制,而大写的 HH 则表示24小时制。 - Austin_Anderson

0

将原始日期输入{{link1:Date对象}},然后使用{{link2:DateFormat}}打印结果。如果{{link3:自动解析方法}}无法接受您的格式,则可能需要将字符串拆分成较小的部分以创建初始Date对象。

伪代码:

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

1
字符串 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("输出:" +date ); 异常:java.text.ParseException: 无法解析的日期:"2011-03-10T11:54:30.207Z" - user617966
1
据我所知,SimpleDateFormat 不是线程安全的。如果您需要一个线程安全的解决方案,请使用 joda-time,并使用 PeriodFormatterBuilder 构建格式化程序,例如:PeriodFormatterBuilder,享受轻松的日期处理。 - moritz
嗯,自动解析器宽容一些,但还不够智能。我想你最终还是得编写convertYourInputIntoADateInWhateverWayYouPrefer()方法。 - Pops
+1 @Moritz,我试图提供一个简单易懂的解决方案(通常是这样),但如果这是为生产而做的话,使用joda time肯定有优势。 - Pops

0
你可能想看看joda time,它比Java本地日期工具更容易使用,并提供许多常见的日期格式预构建。
针对评论,更多细节:

使用Joda Time,您需要两个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) );

我遇到了异常:java.text.ParseException: Unparseable date: "2011-03-10T11:54:30.207Z",请查看我的问题,我已经进行了编辑。 - user617966
我已经下载了joda time,但不知道如何将ISO8601转换为UTC格式。请指导。 - user617966
@user617966:UTC 不是一个格式,它是一个时区(有效地)。 - Jon Skeet

0
希望这可以帮到你:
public String getSystemTimeInBelowFormat() {
    String timestamp = new SimpleDateFormat("yyyy-mm-dd 'T' HH:MM:SS.mmm-HH:SS").format(new Date());
    return timestamp;
}

-3
使用DateFormat。 (抱歉,问题的简洁程度不足以支持更长或更详细的答案。)

抱歉造成任何不便。我遇到了异常:java.text.ParseException: Unparseable date: "2011-03-10T11:54:30.207Z" 错误,请查看我编辑过的问题。 - user617966

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接