【问题标题】:Quickest way for converting date format in Java?在 Java 中转换日期格式的最快方法?
【发布时间】:2012-03-12 14:19:10
【问题描述】:

我有一个文本字段,它以这种格式显示日期字符串:MM/dd/yyyy(例如 03/12/2012)...我想将其转换为这种格式:yyyy-MM-dd(例如 2012 -03-12) ...所以基本上我需要的转换是:

MM/dd/yyyy ---> yyyy-MM-dd

两种数据类型都是字符串..

最快的方法是什么?

【问题讨论】:

  • 写代码最快,还是执行最快?
  • 您想更改日期在文本字段中的显示方式还是转换为以后使用?

标签: java date date-format


【解决方案1】:

我只会使用一个单独的格式对象(即SimpleDateFormatDateFormat)并将其应用于同一个Date 对象。

在同一对象的字符串表示之间进行转换没有多大意义;提供不同的视图更有意义。

【讨论】:

    【解决方案2】:
    DateFormat formatter = new SimpleDateFormat("MM/dd/yy");
    Date date = (Date)formatter.parse("03/12/2012");
    
    formatter = new SimpleDateFormat("yyyy-MM-dd");
    String formattedDate = formatter.format(date); //yyyy-MM-dd
    

    【讨论】:

      【解决方案3】:

      可以只是用字符串摆弄来做 - 但我个人会解析为一些日期/时间表示,然后再次格式化。

      使用标准库,您可以使用SimpleDateFormat。就我个人而言,我会使用Joda Time 并用DateFormatter 解析为LocalDate(然后用另一个格式化)。您将使用DateTimeFormat 创建DateTimeFormatter 实例。请注意,Joda Time 的格式类是线程安全的; Java 标准库不是。

      【讨论】:

        【解决方案4】:

        您可以像这样简单地使用 String#split:

        String str = "03/12/2012";
        String arr[] = str.split("/");
        String newDate = arr[2] + '-' + arr[0] + '-' + arr[1];
        

        【讨论】:

          【解决方案5】:

          您要求最快方式:

          @Test
          public void test() {
              assertEquals("2016-10-29", convert("10/29/2016"));
          }
          
          // MM/dd/yyyy ---> yyyy-MM-dd
          public static String convert(final String date) {
              // We assume that the format is guaranteed to be correct,
              // otherwise add validation logic
              final char[] chars = new char[10];
              date.getChars(0, 5, chars, 5); // MM/dd
              date.getChars(6, 10, chars, 0); // yyyy
              chars[4] = chars[7] = '-';
              return new String(chars);
          }
          

          【讨论】:

            【解决方案6】:

            你可以在那里找到你想要的一个很好的例子:

            SimpleDateFormat Converting

            您只需使用 SimpleDateFormat 即可。

            【讨论】:

              【解决方案7】:

              由于“我有一个显示日期字符串的文本字段”,您应该只使用普通的 DateFormat。通过优化日期格式,您不太可能注意到应用程序性能的任何可测量差异。因此,只需使用类似的东西(并且只要您在单线程中,就可以重用解析器和格式化程序):

              SimpleDateFormat parser = new SimpleDateFormat("MM/dd/yyyy");
              SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
              String date = "03/12/2012";
              Date d = parser.parse(date);
              String result = formatter.format(d);
              

              如果您有时会遇到性能非常重要的情况,那么您可以选择这种实现方式(不像使用 subtring-approaches 创建的 String 实例那么多):

              String date = "03/12/2012";
              char[] cc = date.toCharArray();
              char[] converted = {cc[6], cc[7], cc[8], cc[9], '-', 
                                  cc[0], cc[1], '-', cc[3],cc[4]};
              String result = new String(converted);
              

              【讨论】:

                【解决方案8】:

                也许

                String date = "MM/dd/yyyy";
                String date2 = date.substring(6)+'-'+date.substring(3,5)+'-'+date.substring(0,2);
                System.out.println(date2);
                

                打印

                yyyy-dd-MM
                

                它还将重新订购任何正确(或不正确的日期)

                【讨论】:

                  【解决方案9】:

                  如果保证传入格式,那么

                  String inputDate = "12/31/1970"; // for example
                  String outputDate = inputDate.substring(6, 10) + '-' 
                      + inputDate.substring(0, 2) + '-' 
                      + inputDate.substring(3, 5);
                  

                  可能是最快的执行。

                  如果不能保证传入的格式,我会按照其他答案的建议使用 DateFormat 解析和格式化。

                  【讨论】:

                    【解决方案10】:

                    java.time

                    最快的写法:

                    LocalDate.parse( 
                        "03/12/2012" ,
                        DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) 
                    ).toString()
                    

                    您想要的输出恰好符合格式化日期时间字符串的ISO 8601 标准。 java.time 类在解析和生成表示其值的字符串时使用这些标准格式。

                    java.time.LocalDate 类内置于 Java 8 及更高版本中,它表示没有时间和时区的仅日期值。

                    大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

                    最快执行?

                    如果我们缓存 DateTimeFormatter,当在 Java 8 Update 111 下的 NetBeans 8.2 中运行时,每个 parse-a-string-to-generate-a-string 的成本需要三分之一微秒,即 300-400 纳秒在 MacBook Pro(Retina,15 英寸,2013 年末)(2.3 GHz Intel Core i7 处理器)(16 GB 1600 MHz DDR3)(macOS El Capitan)上。

                    DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MM/dd/uuuu" );
                    int limit = 100_000_000; // Number of iterations of parsing a string to generate a string.
                    long start = System.nanoTime ();
                    for ( int i = 0 ; i < limit ; i ++ ) {
                        String s = LocalDate.parse ( "03/12/2012" , f ).toString ();
                    }
                    long stop = System.nanoTime ();
                    long elapsedNanos = ( stop - start );
                    long elapsedSeconds = TimeUnit.NANOSECONDS.toSeconds ( elapsedNanos );
                    long eachNanos = ( elapsedNanos / limit );
                    System.out.println ( "For limit of " + limit + " took seconds: " + elapsedSeconds + " and each iteration took nanoseconds: " + eachNanos );
                    

                    对于 100000000 的限制需要秒:33,每次迭代需要纳秒:332

                    实例化DateTimeFormatter 似乎需要大约 200 纳秒,执行时间几乎翻了一番。更改上面的一行代码,以替换参数f

                        String s = LocalDate.parse ( "03/12/2012" , DateTimeFormatter.ofPattern ( "MM/dd/uuuu" ) ).toString ();
                    

                    对于 100000000 的限制需要秒:54,每次迭代需要纳秒:542


                    关于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

                    【讨论】:

                      猜你喜欢
                      • 2019-08-03
                      • 2017-01-16
                      • 1970-01-01
                      • 2017-08-15
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-02-13
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多