Java 使用毫秒分析dateFormat的SimpleDataFormat问题

Java 使用毫秒分析dateFormat的SimpleDataFormat问题,java,simpledateformat,datetime-parsing,Java,Simpledateformat,Datetime Parsing,我正在迁移一些数据(在java中),从几个不同的源(使用不同的格式)提取日期字符串,并需要以一致的格式发送它们。因此,我有一个方法,它接受一个字符串(以及它的来源,以便我知道使用哪种格式)并将其转换为日期,这样我就可以从那里开始了 问题:除第一种格式外,所有格式都工作正常:返回的结果日期值与我给出的原始字符串相差0-17分钟 // Take a string, convert to a date public static Date convertStringToDate (String dat

我正在迁移一些数据(在java中),从几个不同的源(使用不同的格式)提取日期字符串,并需要以一致的格式发送它们。因此,我有一个方法,它接受一个字符串(以及它的来源,以便我知道使用哪种格式)并将其转换为日期,这样我就可以从那里开始了

问题:除第一种格式外,所有格式都工作正常:返回的结果日期值与我给出的原始字符串相差0-17分钟

// Take a string, convert to a date
public static Date convertStringToDate (String dateString, String source) {
    String dateFormat = null;
    switch (source)
    {
        case "DATA": //@FIXME: these vary 0-17 minutes off!
            dateFormat = "yyyy-MM-dd HH:mm:ss.SSSSSS"; // 2018-08-29 20:09:26.863631 (ex: mailing list records)
            break;
        case "DATA_EN": // encrypted dates use a different format
            dateFormat = "yyyy-MM-dd HH:mm:ss ZZZZ"; // 2019-06-12 14:33:27 +0000 (ex: encrypted_patient_information_complete_at)
            break;
        case "DatStat":
            dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"; // 2018-08-29T14:33:49Z (ex: followup survey)
            break;
        case "download":
            if (dateString.length() > 10 ){ // the majority of these will be in format 1/9/16 9:30
                dateFormat = "M/dd/yy HH:mm"; // 2/16/18 19:58 (ex: csv from datstat)
            } else { // dates submitted at midnight lose their time and have format 9-Jan-16
                dateFormat = "dd-MMM-yy"; // 9-Jan-16
            }
            break;
        default:
            dateFormat = "INVALID SOURCE VALUE GIVEN";
            break;
    }

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
    Date dt = null;
    try {
        dt = sdf.parse(dateString);
    }
    catch (Exception ex) {
        throw new RuntimeException("An error has occurred trying to parse timestamp." + dateString, ex);
    }
    return dt;
}
输入/输出示例:

  • 保存字符串:“2019-06-12 14:33:08.712754”
  • 我们收到的日期:“2019-06-12T14:45:00Z”

我想知道这种格式是否有什么特别的地方我没有弄清楚,但在阅读中没有发现任何东西。有人知道问题可能是什么吗?或者你以前见过这个

正如其他人在评论中提到的,其他人的帖子很好地回答了这个问题:

事实上,
ssss
不作为该类的格式存在,它只需要3毫秒的数字。因此,它被解释为这样<代码>日期格式将712754解释为712754/1000秒,而不是0.712754秒。 如果你做微积分,它是11,86。分钟,即11mn52秒。 所以33:08+11:52,是45:00,你得到的结果


至于解决方案,您可以去掉毫秒部分的其余部分,因为您无论如何都不需要它(正如您所做的那样),或者使用另一个类(来自Ole V.V的所有注释都是正确的)。

与此同时,我的解决方法是去掉字符串中的毫秒,并使用“yyyy-MM-dd HH:MM:ss”,这是正确的。我建议您不要使用
SimpleDateFormat
Date
。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。使用
LocalDateTime
DateTimeFormatter
和来自的其他类。可能重复和/或对您的问题关注甚少,可能是由于标记不当。sdf标记不适用于SimpleDataFormat。我一直在努力改进,希望不会太晚(老问题也会受到较少关注,不确定是在几个小时后还是几天后发生)。还有一个类似的问题:。