如何将字符串输入转换为毫秒到Date

时间:2013-05-23 19:35:58

标签: java

我有一个java方法,需要将Date从一个输入String格式转换为另一个。输入和输出格式必须保留所有毫秒细节,因为这是一个过程跟踪解决方案,其中时间戳通常只有几毫秒。

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] [result=20130523123258133]

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

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

谢谢!

3 个答案:

答案 0 :(得分:0)

如果您可以假设在每种情况下月,日,分,秒都有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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

java.time

现代方法使用了几年前的 java.time 类,该类取代了麻烦的旧类,例如DateCalendarSimpleDateFormat。无需再碰那些可怕的旧类。

使用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-Timemaintenance mode项目建议迁移到java.time类。

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

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore