【问题标题】:How can I convert a timestamp from yyyy-MM-ddThh:mm:ss:SSSZ format to MM/dd/yyyy hh:mm:ss.SSS format? From ISO8601 to UTC如何将时间戳从 yyyy-MM-ddThh:mm:ss:SSSZ 格式转换为 MM/dd/yyyy hh:mm:ss.SSS 格式?从 ISO8601 到 UTC
【发布时间】:2011-03-22 15:44:00
【问题描述】:

我想将时间戳 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”

【问题讨论】:

    标签: java datetime


    【解决方案1】:

    首先,您需要知道 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”代表什么?
    • @KevinZhao:'T'只是时间和日期的分隔方式; 'Z' 是表示 UTC 作为时区的方式 - “祖鲁时间”。
    • 谢谢。这个真的帮助了我最终的 DateTimeFormatter parser = ISODateTimeFormat.dateTime(); parsedDate = parser.parseDateTime(stringDate).toDate();
    【解决方案2】:

    是的。你可以像这样使用 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 新日期-->2011 年 3 月 10 日 11:54:30.207

    【讨论】:

    • 注意,小写hh是12小时格式,HH是24小时
    【解决方案3】:

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

    【讨论】:

    • 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("输出:" +date );异常:java.text.ParseException:无法解析的日期:“2011-03-10T11:54:30.207Z”
    • 据我所知 SimpleDateFormat 不是线程安全的,如果您需要线程安全的解决方案,请使用 joda-time 并使用PeriodFormatterBuilder 构建格式化程序,并享受应有的简单日期处理.
    • 好吧,自动解析器是宽松的,但还不是有感知的。我想您毕竟必须编写 convertYourInputIntoADateInWhateverWayYouPrefer() 方法。
    • +1 @Moritz,我试图寻找一个简单易懂的解决方案(就像我通常做的那样),但如果这是用于生产,joda time 肯定有优势。
    【解决方案4】:

    你可能想看看joda time,它比java原生日期工具更容易使用,并且提供了许多预先构建的常见日期模式。

    回应cmets,更详细:

    要使用 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) );
    

    【讨论】:

    • 我收到异常:java.text.ParseException: Unparseable date: "2011-03-10T11:54:30.207Z" 错误请参阅我已编辑的问题。
    • 我已经下载了joda time,但是不知道如何将ISO8601转换为UTC格式。请指导
    • @user617966:UTC 不是一种格式,它是一个时区(实际上)。
    【解决方案5】:

    希望对您有所帮助:

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

    【讨论】:

      【解决方案6】:

      使用DateFormat。 (抱歉,问题的简短性并不保证提供更长或更详细的答案。)

      【讨论】:

      • 抱歉给您带来不便。我收到 Exception :java.text.ParseException: Unparseable date: "2011-03-10T11:54:30.207Z" 错误请参阅我编辑的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2013-08-31
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多