无法识别简单日期格式

Simple Date format not recognised

提问人:Ray Bond 提问时间:10/12/2023 最后编辑:Mark RotteveelRay Bond 更新时间:10/12/2023 访问量:121

问:

我在 Windows 10 上使用 Java 17 使用简单日期格式。

我正在尝试获得这样的日期格式,但我得到了.日期位于 Jackson 2.15 ObjectMapper 中。2023-10-12 21:26:162023-Oct-12 21:26:16

这是我的代码:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ", new Locale("en", "NZ")));
ErrorMessage errorMessage = new ErrorMessage();
...
String jsonMessage =  objectMapper.writeValueAsString(errorMessage.builder()
        .message(mostSpecificCauseMessage)
        .timeStamp(sdf.format(System.currentTimeMillis()))
        .build());

我错过了什么,我怎样才能与 vs 约会?2023-10-12 ....2023-Oct-12...

Java DateTime Jackson SimpleDateFormat 对象映射器

评论

0赞 Pino 10/12/2023
在您的代码中是 ,而不是 .timestampStringDate
0赞 Samuel Marchant 10/12/2023
看起来与 SQL“timestamp”、“date”非常相似!!你似乎想要。SQL有一些“类型”date,time,timestamp ,datetime
0赞 Chaosfire 10/12/2023
月份的格式是(如果这是问题的话),但你真的应该使用 ,而不是早已过时且容易出错的 , 等。OctMMMjava.timeSimpleDateFormatjava.util.Date
0赞 Arvind Kumar Avinash 10/12/2023
您尚未显示可能导致您所面临问题的代码。另外,请远离容易出错的日期时间 API,并使用新式 API。sdfjava.utiljava.time
0赞 Anonymous 10/12/2023
如果你能避免使用麻烦和早已过时的和 ,你应该。使用 java.time,即现代 Java 日期和时间 API。还有 jackson-modules-java8DateSimpleDateFormat

答:

1赞 Peng 10/12/2023 #1

您的代码中可能存在潜在的原因,其中 JSON 中的日期列将是字符串,而不是日期,因此您可以尝试以下代码片段,它可以帮助您意识到问题。


    @Test
    @SneakyThrows
    public void test () {
        ObjectMapper objectMapper = new ObjectMapper();

// Configure the date format with a specific locale
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ", new Locale("en", "NZ"));
        objectMapper.setDateFormat(sdf);

// Create an instance of ErrorMessage and set its properties
// ...

// Serialize the ErrorMessage object to a JSON string
        String jsonMessage = objectMapper.writeValueAsString(new Date());
        System.out.println(jsonMessage);
    }

这就是结果

"2023-10-12 08:56:57.984+0000"
1赞 Mikhail2048 10/12/2023 #2

有几件事需要考虑:

首先,您的类有一个时间戳字段,该字段是 String 或 StringBuffer,但不是日期(因为您是通过 设置它的)。因此,对于此时间戳字段,行:ErrorMessagesdf.format(System.currentTimeMillis())

objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ", new Locale("en", "NZ")));

基本上不做任何事情,因为 for Jackson 字段只是 ,而不是任何 Java 日期/时间 API 类。timestampString/StringBuffer

第二 - 你的情况是什么样子的?这就是从纪元中实际格式化了几毫秒的内容。如果它看起来像 ,那么你应该得到你想要的结果。有关更详细的解释,您应该提供一个支持 .sdfyyyy-MM-dd HH:mm:ss.SSSZsdf

评论

1赞 Ray Bond 10/12/2023
我犯了一个愚蠢的错误,错过了设置 sdf 的代码 - - 一旦纠正了这一点,我就得到了我想要的格式。正如您所指出的,objectMapper 行不执行任何操作。private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss");
0赞 Just another Java programmer 10/12/2023
请注意,如果坚持 SimpleDateFormat,请不要将其设置为静态,因为它不是线程安全的。