【问题标题】:How to convert String input with milliseconds to Date如何将字符串输入以毫秒为单位转换为日期
【发布时间】:2013-05-23 19:35:57
【问题描述】:

我有一个需要将日期从一种输入字符串格式转换为另一种的 java 方法。输入和输出格式必须保留所有毫秒细节,因为这是用于时间戳通常仅相隔毫秒的流程跟踪解决方案。

SimpleDateFormat 似乎丢失了所有毫秒数据,只返回秒和毫秒的随机数。

输入日期字符串:“05/23/2013 12:32:13.45133” 输入日期格式:“MM/dd/yyyy HH:mm:ss.SSSSS” 输出日期格式:“yyyyMMddHHmmssSSS”

鉴于上述输入日期和格式,我生成的日期字符串为:20130523123258133。这显然与输入秒数完全不同。

输入格式可能不同,但输出格式必须始终相同。

下面是目前的方法:

private long dateSequencer(String inputDt, String inputFormat) {
    long result = 0;
    try {
        // Convert input date into yyyyMMddHHmmssSSS format for sequencing
        SimpleDateFormat dtFrmt = new SimpleDateFormat(inputFormat);
        Date dt = new Date();
        dt = dtFrmt.parse(inputDt);
        // input String converted to Date, now reformat to Long
        dtFrmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String reFrmt = dtFrmt.format(dt);
        result = Long.parseLong(reFrmt);
    } catch (Exception ex) {
        System.out.println("++++ Exception converting dateSequencer: " + ex.toString());
    }
    System.out.print("+++ABM dateSeq: [inputDt=" + inputDt + "] [inputFormat=" + inputFormat + "] [result=" + result +"]");
    return result;
}

运行时的日志文件条目:

+++ABM dateSeq: [inputDt=05/23/2013 12:32:13.45133] [inputFormat=MM/dd/yyyy HH:mm:ss.SSSSS] [结果=20130523123258133]

由于输入格式可能会改变,我无法手动解析输入字符串以依赖特定模式。这就是为什么我允许传递模式,并使用 SimpleDateFormat 转换为 Date,然后再转换回 String。

我怎样才能可靠地做到这一点?有没有更有效的方法将给定的输入日期字符串转换为标准格式?

谢谢!

【问题讨论】:

    标签: java


    【解决方案1】:

    如果您可以假设在每种情况下,月、日、分、秒都有 2 位数字,年有 4 位数字,毫秒有 3 位数字并且只是模式不同,您可以简单地执行以下操作:

    public static long convert(String inputDt, String inputFormat) {
        int dd = inputFormat.indexOf("dd");
        int MM = inputFormat.indexOf("MM");
        int yyyy = inputFormat.indexOf("yyyy");
        int HH = inputFormat.indexOf("HH");
        int mm = inputFormat.indexOf("mm");
        int ss = inputFormat.indexOf("ss");
        int SSS = inputFormat.indexOf("SSS");
        return Long.valueOf(inputDt.substring(yyyy,yyyy+4) + inputDt.substring(MM, MM+2) + inputDt.substring(dd, dd+2) + inputDt.substring(HH, HH+2)
                + inputDt.substring(mm, mm+2) + inputDt.substring(ss, ss+2) + inputDt.substring(SSS,SSS+3));        
    }
    
    convert("05/23/2013 12:32:13.133", "MM/dd/yyyy HH:mm:ss.SSS") yields 20130523123213133
    

    【讨论】:

      【解决方案2】:

      您输入的日期字符串:“05/23/2013 12:32:13.45133”包含 5 位毫秒数。这是不可能的......必须有3位数字。所以 45133 毫秒等于 45 秒和 133 毫秒。您输入的日期字符串是日期“05/23/2013 12:32:58.133”

      【讨论】:

        【解决方案3】:

        java.time

        现代方法使用 java.time 类,该类在几年前取代了麻烦不断的旧类,例如 Date & Calendar & SimpleDateFormat。无需再接触那些可怕的遗留类。

        使用DateTimeFormatter 类定义格式模式以适合您的输入。

        String input = "05/23/2013 12:32:13.45133"
        DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern( "MM/dd/uuuu HH:mm:ss.SSSSS" );
        LocalDateTime ldt = LocalDateTime.parse( input , formatterInput );
        
        DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern( "uuuuMMddHHmmssSSS" );
        String output = ldt.format( formatterOutput );
        
        System.out.println( ldt );
        System.out.println( output );
        

        ISO 8601

        顺便说一句,您想要的输出格式恰好接近标准的ISO 8601 格式。标准中的“基本”版本最大限度地减少了分隔符的使用:YYYY-MM-DDTHH:MM:SS.S 与 YYYYMMDDTHHMMSS.S 就像您所做的那样。

        我建议您练习使用标准格式,而不是自己发明。为了遵守,请在日期部分和时间部分之间添加T


        关于java.time

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

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

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

        您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

        从哪里获得 java.time 类?

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

        【讨论】:

          猜你喜欢
          • 2020-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 2012-07-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多