【发布时间】:2020-06-24 19:35:51
【问题描述】:
我正在尝试使用 SimpleDateFormat 将日期格式化为 ISO8601("yyyy-MM-dd'T'HH:mm:ss.SSSZ"),但格式化的字符串似乎在毫秒位置。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class DemoApplication {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(TimeZone.getDefault());
calendar.set(2020, 5 , 22, 17, 30, 00);
Date date = calendar.getTime();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
String s = df.format(date);
System.out.println(s);
}
}
多次运行的输出:
2020-06-22T17:30:00.886+0530
2020-06-22T17:30:00.049+0530
2020-06-22T17:30:00.799+0530
在上面的输出中,除了点(。)之后的毫秒之外,一切都是一致的,有人可以解释一下吗?
【问题讨论】:
-
您使用 Java 的旧旧日期 API 而不是更好的
java.time,是否有特定原因? -
@Zabuzard 没有具体原因,这是一个旧代码库,它试图通过在杰克逊的对象映射器中设置 dateFormat 来序列化日期字段。在编写测试用例时遇到了这个问题。
-
@ArvindKumarAvinash - 不同意。此问题的根本原因是 OP 使用了
Calendar的set方法,而没有清除/显式设置其MILLISECOND字段。 -
@AlexRudenko 一个(也许不是唯一的)根本原因是
Calendar有一个令人困惑的 API。我建议(至少在 java.time,2014 年 3 月之后)我们不再使用该类。我知道这个最小的例子是从旧代码派生的,可能是在 java.time 出现之前。 PS您链接到的原件是正确的。 -
@OleV.V.我很清楚并且完全同意
Date/Calendar已经过时并且根本不需要使用。但是,当人们遇到遗留代码问题(OP 明确指出这一点)或一些学校教授过时的技术堆栈时,会有不同的情况。而且我相信在这种情况下提及/提及显然过时的解决方案来解决过时的问题并不是一种罪过,它比仅仅建议切换到新的和闪亮的东西要好:)