【问题标题】:Java date formattingJava 日期格式
【发布时间】:2011-11-16 03:23:17
【问题描述】:

输入字符串如下所述

20110913T100702.631 格林威治标准时间

需要的输出是这样的格式

2011 年 9 月 13 日,星期二 17:52:PM

你能帮我解决这个问题吗? (在此示例中,输入值和输出值没有连接,它们是 2 个单独的值)

【问题讨论】:

  • 你试过什么代码?如果您展示您尝试过的代码,我们可以尝试帮助您找出您做错了什么。
  • 您是否考虑过使用 SimpleDateFormat?请先展示您自己的努力成果,以便我们更好地帮助您。
  • 看看SimpleDateFormat类。
  • 17:52 PM...冗余部门使用的格式?

标签: java parsing date format


【解决方案1】:

试试:

private String formatDate() throws Exception {
    DateFormat inputFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss.SSS Z");
    DateFormat outputFormat = new SimpleDateFormat("EEEEE', 'MMMMM' 'dd', 'yyyy' 'h:mm:a");
    Date date = inputFormat.parse("20110913T100702.631 GMT ");
    return outputFormat.format(date);
}

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      tl;博士

      ZonedDateTime.parse (
          "20110913T100702.631 GMT" , 
          DateTimeFormatter.ofPattern( "uuuuMMdd'T'HH:mm:ss.SSS z" )
      ).format( 
           DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL , FormatStyle.SHORT )
                            .withLocale( Locale.US )
       )
      

      2011 年 9 月 13 日,星期二上午 10:07

      ISO 8601

      您的输入字符串几乎符合定义为标准ISO 8601 格式的“基本”版本的格式。 basic 一词的意思是尽量减少使用 ISO 8601 格式的更常见“扩展”版本所使用的分隔符。

      String input = "20110913T100702.631 GMT" ;
      

      使用 java.time

      其他答案使用麻烦的旧日期时间类,现在被 java.time 类取代。

      java.time 类在解析/生成字符串时默认使用许多标准的ISO 8601 格式。所以通常不需要指定格式模式。但是默认不支持这种特殊的basic格式,所以我们必须指定一个格式化模式。

      DateTimeFormatter fInput = DateTimeFormatter.ofPattern ( "uuuuMMdd'T'HHmmss.SSS z" );
      

      解析为ZonedDateTime

      ZonedDateTime zdt = ZonedDateTime.parse ( input, fInput );
      

      要以所需格式生成表示ZonedDateTime 对象值的字符串,您可以定义指定格式模式。但我建议您改为让 java.time 为您自动本地化。

      要本地化,请指定:

      • FormatStyle 确定字符串的长度或缩写。
      • Locale 确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。

      那么……

      // Generate output string
      Locale locale = Locale.US;  // Or Locale.CANADA_FRENCH, Locale.ITALY, etc.
      DateTimeFormatter fOutput =
          DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL, FormatStyle.SHORT ) // Specify format style of date portion, then time-of-day portion.
                           .withLocale ( locale );
      String output = zdt.format ( fOutput );
      

      转储到控制台。

      // Dump to console
      System.out.println ( "input: " + input );
      System.out.println ( "zdt.toString(): " + zdt );
      System.out.println ( "output: " + output );
      

      this code run live at IdeOne.com

      输入:20110913T100702.631 GMT

      zdt.toString(): 2011-09-13T10:07:02.631Z[GMT]

      输出:2011 年 9 月 13 日星期二上午 10:07


      关于java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

      Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

      从哪里获得 java.time 类?

      ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

      【讨论】:

        猜你喜欢
        • 2010-11-03
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多