在Java模型中将一种日期格式重新映射为另一种日期格式

时间:2019-03-14 15:19:14

标签: java json

1)我从API获得的日期格式为yyyy-MM-dd'T'HH:mm:ss.SSSXXX

2)我想返回一个Json列表,其中日期以不同的格式显示在前端,例如:dd MM HH:mm

在2)示例中是否有任何注释或属性可以重新映射日期,就像在1)中一样,可以通过@JsonFormat轻松实现。

2 个答案:

答案 0 :(得分:2)

UTC偏移量

格式化格式中的XXX是指offset-from-UTC。这意味着日期和日期表示的时刻比基准UTC早或晚数小时-分钟-秒。

OffsetDateTime

因此使用OffsetDateTime解析该输入。

OffsetDateTime odt = OffsetDateTime.parse( "2019-01-23T12:34:56.123+05:30" ) ;

请勿误导将LocalDateTime类用于此类输入。此类故意缺少任何time zoneoffset-from-UTC的概念。因此,此类不能用于表示时刻。用此类分析您的输入会不计后果地丢弃有价值的信息。参见:What's the difference between Instant and LocalDateTime?

Table of types of date-time class in modern java.time versus legacy

DateTimeFormatter

要生成以标准ISO 8601格式表示此值的字符串,只需调用toString

String output = odt.toString() ;  // Generate string in standard ISO 8601 format.

要生成其他格式的字符串,请使用DateTimeFormatter类。您可以指定自定义格式,或者更好的方法是让类自动为您本地化。

要本地化,请指定:

  • FormatStyle来确定字符串应该是多长时间或缩写。
  • Locale确定:
    • 用于翻译日名,月名等的人类语言
    • 文化规范决定缩写,大写,标点,分隔符等问题。

示例:

Locale l = Locale.CANADA_FRENCH ;   // Or Locale.US, Locale.JAPAN, etc.
DateTimeFormatter f = 
    DateTimeFormatter
    .ofLocalizedDateTime( FormatStyle.FULL )
    .withLocale( l )
;
String output = zdt.format( f );

Search Stack Overflow获取更多信息,因为DateTimeFormatter已经被报道了很多次。

ISO 8601

您的输入字符串恰好是标准ISO 8601格式。

java.time 类在解析/生成字符串时默认使用这些标准格式。因此,无需指定格式设置模式。


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

您可以像这样在getter(例如getDate())中添加一些逻辑:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String inputDate = "2014-07-04T12:08:56.235-07:00";
        String inputFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

        String outputFormat = "dd MM HH:mm";

        // Input formatter
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputFormat);

        // Time after formatting
        LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter);

        // Output formatter
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputFormat);

        // Output date as String
        String outputDate = dateTime.format(outputFormatter);

        System.out.println(outputDate);
    }
}