3

我有一个需要将日期从一种输入字符串格式转换为另一种的 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。

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

谢谢!

4

3 回答 3

0

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

于 2013-05-24T18:39:58.933 回答
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
于 2013-05-23T22:05:37.267 回答
0
于 2018-11-05T18:43:26.903 回答