Java 如何将以毫秒为单位的字符串输入转换为日期

Java 如何将以毫秒为单位的字符串输入转换为日期,java,Java,我有一个java方法,需要将日期从一种输入字符串格式转换为另一种。输入和输出格式必须保留所有毫秒的细节,因为这适用于时间戳通常仅相隔毫秒的流程跟踪解决方案 SimpleDataFormat似乎丢失了所有毫秒数据,只返回秒和毫秒的随机数 输入日期字符串:“05/23/2013 12:32:13.45133” 输入日期格式:“MM/dd/yyyy HH:MM:ss.SSS” 输出日期格式:“yyyymmddhhmmssss” 根据上述输入日期和格式,我得到的日期字符串是:20130523123258

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

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

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

根据上述输入日期和格式,我得到的日期字符串是: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] [result=20130523123258133] +++ABM dateSeq:[inputDt=05/23/2013 12:32:13.45133][inputFormat=MM/dd/yyyy HH:MM:ss.SSSSS][result=20130523123258133] 由于输入格式可能会更改,因此我无法手动解析输入字符串以依赖特定模式。这就是为什么我允许传递模式,并使用SimpleDataFormat转换为日期,然后再转换回字符串

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


谢谢

如果您可以假设在每种情况下,月、日、分、秒有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
您的输入日期字符串:“05/23/2013 12:32:13.45133”包含5位毫秒数字。这是不可能的。。。必须有3位数字。45133毫秒等于45秒133毫秒。您输入的日期字符串是日期“05/23/2013 12:32:58.133”

java.time 现代方法使用java.time类,这些类在几年前就取代了有问题的旧类,如
Date
&
Calendar
&
SimpleDateFormat
。再也不用碰那些可怕的遗留类了

定义一个格式化模式以适应类的输入

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

我建议你练习使用标准格式,而不是发明自己的格式。要符合要求,请在日期部分和时间部分之间添加
T


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(
      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 );