将字符串转换为带毫秒的日期

Convert String to Date with Milliseconds

我知道有很多关于如何将字符串转换为日期的主题,我正在使用 'SimpleDateFormat' 并且我有一个包含(年、月、日、小时、分钟、秒、毫秒)的字符串) 但是当我使用 'SimpleDateFormat' 时,没有设置毫秒 这里是代码和输出:

import java.text.SimpleDateFormat;
import java.util.Date;

String strDate = "2020-08-27T10:06:07.413";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date dateFormatter = formatter.parse(strDate);

System.out.println(dateFormatter);

输出:

Thu Aug 27 10:06:07 WAT 2020

我想要日期类型的结果

日期 class 将时间存储为毫秒,如果查看日期对象,您会发现它实际上有 1598515567413 毫秒的时间。

你被使用 Date 的 toString() 方法的 System.out.println() 愚弄了。此方法使用“EEE MMM dd HH:mm:ss zzz yyyy”格式显示日期并简单地省略所有毫秒数。

如果您使用格式字符串中包含毫秒的格式化程序,您将看到毫秒是正确的:

System.out.println(formatter.format(dateFormatter));

输出 2020-08-27T10:06:07.413

您可以使用:

String strDate = "2020-08-27T10:06:07.413"

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
DateTime datetimeDF = formatter.parseDateTime(strDate);
String text = formatter.print(datetimeDF);

System.out.println(text);

或者您可以使用 java.time:

String strDate = "2020-08-27T10:06:07.413"
LocalDateTime ldate = LocalDateTime.parse(datetime, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"));

并根据需要使用对象 ldate

更新(基于 OP 的 ):

您提到了:谢谢,这真的很有帮助我已经尝试了 java.util 但我无法使用 LocalDateTime 在数据库中设置日期,这就是为什么我我正在使用日期

您必须使用 PreparedStatement#setObjectLocalDate 设置到数据库 table 例如

LocalDate localDate = LocalDate.now();
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, localDate);
st.executeUpdate(); 
st.close();

原回答:

下面给出的是 java.util.DatetoString 实现:

public String toString() {
    // "EEE MMM dd HH:mm:ss zzz yyyy";
    BaseCalendar.Date date = normalize();
    StringBuilder sb = new StringBuilder(28);
    int index = date.getDayOfWeek();
    if (index == BaseCalendar.SUNDAY) {
        index = 8;
    }
    convertToAbbr(sb, wtb[index]).append(' ');                        // EEE
    convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' ');  // MMM
    CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd

    CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':');   // HH
    CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
    CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
    TimeZone zi = date.getZone();
    if (zi != null) {
        sb.append(zi.getDisplayName(date.isDaylightTime(), TimeZone.SHORT, Locale.US)); // zzz
    } else {
        sb.append("GMT");
    }
    sb.append(' ').append(date.getYear());  // yyyy
    return sb.toString();
}

如您在此实现中所见,它不包括 milliseconds,因此如果您按以下代码打印 date,您将得到 Date#toString returns 因此,您不会在输出中看到 milliseconds

String strDate = "2020-08-27T10:06:07.413";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date date= formatter.parse(strDate);
System.out.println(date);

我假设您已经知道 System.out.println(obj) 打印 obj.toString() 返回的字符串。

如何获得自定义格式的输出?

您有两个选择:

  1. 推荐选项:使用 date-time 格式化程序,例如SimpleDateFormat如下图:

    String strDate = "2020-08-27T10:06:07.413";
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
    Date date = formatter.parse(strDate);
    System.out.println(date);
    
    String dateStr = formatter.format(date);
    System.out.println(dateStr);
    
  2. 通过扩展 java.util.Date 创建自定义 class 来覆盖 DatetoString 实现。虽然这是一个选项,但我从不推荐这样做。

最后提个建议:

停止使用和error-pronejava.utildate-timeAPI和SimpleDateFormat。切换到 modern java.time date-time API and the corresponding formatting API (java.time.format). Learn more about the modern date-time API from Trail: Date Time.