3131import java .text .ParseException ;
3232import java .text .ParsePosition ;
3333import java .time .LocalDate ;
34+ import java .time .LocalDateTime ;
3435import java .time .OffsetDateTime ;
3536import java .time .format .DateTimeFormatter ;
37+ import java .time .format .DateTimeParseException ;
3638import java .util .Date ;
3739import java .util .Map ;
3840import okio .ByteString ;
@@ -51,6 +53,8 @@ public class JSON {
5153 private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter =
5254 new OffsetDateTimeTypeAdapter ();
5355 private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter ();
56+ private static LocalDateTimeTypeAdapter localDateTimeTypeAdapter =
57+ new LocalDateTimeTypeAdapter ();
5458 private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter ();
5559
5660 @ SuppressWarnings ("unchecked" )
@@ -94,6 +98,7 @@ private static Class getClassByDiscriminator(
9498 gsonBuilder .registerTypeAdapter (java .sql .Date .class , sqlDateTypeAdapter );
9599 gsonBuilder .registerTypeAdapter (OffsetDateTime .class , offsetDateTimeTypeAdapter );
96100 gsonBuilder .registerTypeAdapter (LocalDate .class , localDateTypeAdapter );
101+ gsonBuilder .registerTypeAdapter (LocalDateTime .class , localDateTimeTypeAdapter );
97102 gsonBuilder .registerTypeAdapter (byte [].class , byteArrayAdapter );
98103 gsonBuilder .registerTypeAdapterFactory (
99104 new cloud .stackit .sdk .serverupdate .v1api .model .CreateUpdatePayload
@@ -330,6 +335,53 @@ public LocalDate read(JsonReader in) throws IOException {
330335 }
331336 }
332337
338+ /** Gson TypeAdapter for JSR310 LocalDateTime type */
339+ public static class LocalDateTimeTypeAdapter extends TypeAdapter <LocalDateTime > {
340+
341+ private DateTimeFormatter formatter ;
342+
343+ public LocalDateTimeTypeAdapter () {
344+ this (DateTimeFormatter .ISO_LOCAL_DATE_TIME );
345+ }
346+
347+ public LocalDateTimeTypeAdapter (DateTimeFormatter formatter ) {
348+ this .formatter = formatter ;
349+ }
350+
351+ public void setFormat (DateTimeFormatter dateFormat ) {
352+ this .formatter = dateFormat ;
353+ }
354+
355+ @ Override
356+ public void write (JsonWriter out , LocalDateTime date ) throws IOException {
357+ if (date == null ) {
358+ out .nullValue ();
359+ } else {
360+ out .value (formatter .format (date ));
361+ }
362+ }
363+
364+ @ Override
365+ public LocalDateTime read (JsonReader in ) throws IOException {
366+ switch (in .peek ()) {
367+ case NULL :
368+ in .nextNull ();
369+ return null ;
370+ default :
371+ String date = in .nextString ();
372+ try {
373+ return LocalDateTime .parse (date , formatter );
374+ } catch (DateTimeParseException e ) {
375+ if (date .length () > 10 && date .charAt (10 ) == ' ' ) {
376+ date = date .substring (0 , 10 ) + 'T' + date .substring (11 );
377+ return LocalDateTime .parse (date , formatter );
378+ }
379+ throw e ;
380+ }
381+ }
382+ }
383+ }
384+
333385 public static void setOffsetDateTimeFormat (DateTimeFormatter dateFormat ) {
334386 offsetDateTimeTypeAdapter .setFormat (dateFormat );
335387 }
@@ -338,6 +390,10 @@ public static void setLocalDateFormat(DateTimeFormatter dateFormat) {
338390 localDateTypeAdapter .setFormat (dateFormat );
339391 }
340392
393+ public static void setLocalDateTimeFormat (DateTimeFormatter dateFormat ) {
394+ localDateTimeTypeAdapter .setFormat (dateFormat );
395+ }
396+
341397 /**
342398 * Gson TypeAdapter for java.sql.Date type If the dateFormat is null, a simple "yyyy-MM-dd"
343399 * format will be used (more efficient than SimpleDateFormat).
0 commit comments