【问题标题】:Java date formatting?Java日期格式?
【发布时间】:2010-09-29 13:43:46
【问题描述】:

我想读取格式为 YYYY-MM-DD 的日期。

但如果我输入日期,例如 2008-1-1,我想将其读取为 2008-01-01。

有人可以帮我吗?提前致谢

【问题讨论】:

    标签: java date formatting


    【解决方案1】:

    使用SimpleDateFormat

    [已编辑]

    Few sample codes.

    【讨论】:

    • 只需要小心线程问题!我遇到了使用 SimpleDateFormat 产生的最奇怪的错误
    【解决方案2】:

    如果您需要使用内置的 Java 日期/时间处理,Adeel 的解决方案很好,但我个人更愿意使用 Joda Time。在格式化方面,Joda Time 的主要好处是格式化程序是无状态的,因此您可以在线程之间安全地共享它。示例代码:

    DateTimeFormatter parser = DateTimeFormat.forPattern("YYYY-M-D");
    DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-DD");
    
    DateTime dt = parser.parseDateTime("2008-1-1");
    String formatted = formatter.print(dt); // "2008-01-01"
    

    【讨论】:

      【解决方案3】:

      或者使用更好的Joda Time lib。

          DateTime dt = new DateTime();
          System.out.println(dt.toString("yyyy-MM-dd"));
      
          // The ISO standard format for date is 'yyyy-MM-dd'
          DateTimeFormatter formatter = ISODateTimeFormat.date();
          System.out.println(dt.toString(formatter));
          System.out.println(formatter.print(dt));
      

      日期和日历 API 很糟糕。

      【讨论】:

        【解决方案4】:
        import java.text.*;
        
        public class Test
        {
        
            public static void main(String args[])
            {
                try
                {
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");  
                    System.out.println(sdf.parse(args[0]).toString());
                }
                        catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
        

        无论您写为参数“2008-1-1”还是“2008-01-01”,这都能正常工作。

        【讨论】:

          【解决方案5】:

          java.time

          java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

          另外,下面引用的是来自home page of Joda-Time的通知:

          请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

          使用现代日期时间 API java.time 的解决方案:

          import java.time.LocalDate;
          import java.time.format.DateTimeFormatter;
          import java.util.Locale;
          
          public class Main {
              public static void main(String[] args) {
                  DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d", Locale.ENGLISH);
                  String input = "2008-1-1";
                  LocalDate date = LocalDate.parse(input, dtfInput);
                  System.out.println(date);
              }
          }
          

          输出:

          2008-01-01
          

          ONLINE DEMO

          注意事项:

          1. 使用y(指定年份)而不是Y(指定基于周的年份)。
          2. 使用d(指定月日)代替D(指定年日)。
          3. 对于解析,单个u 可以同时满足两位数和四位数字的年份表示。同样,单个M 可以同时满足一位数和两位数的月份。 DateTimeFormatter 以类似的方式处理其他字母。
          4. 在这里,您可以使用y 代替uI prefer u to y
          5. 你一定注意到我没有使用DateTimeFormatter 作为输出字符串。这是因为LocalDate#toString 已经返回ISO-8601 格式的字符串,uuuu-MM-dd(这也是您想要的模式)。

          Trail: Date Time 了解有关现代日期时间 API 的更多信息。


          * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

          【讨论】:

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