|
18 | 18 |
|
19 | 19 | import java.sql.Date;
|
20 | 20 | import java.time.Instant;
|
| 21 | +import java.time.LocalDate; |
| 22 | +import java.time.LocalDateTime; |
21 | 23 | import java.util.Arrays;
|
22 | 24 | import java.util.Calendar;
|
23 | 25 | import java.util.Collection;
|
@@ -80,38 +82,91 @@ public java.sql.Date convert(com.google.cloud.Date date) {
|
80 | 82 | };
|
81 | 83 |
|
82 | 84 | /**
|
83 |
| - * A converter from {@link java.util.Date} to the Spanner date type. |
| 85 | + * A converter from {@link LocalDate} to the Spanner date type. |
84 | 86 | */
|
85 | 87 | // @formatter:off
|
86 |
| - public static final Converter<java.util.Date, com.google.cloud.Date> |
87 |
| - JAVA_TO_SPANNER_DATE_CONVERTER = new Converter<java.util.Date, com.google.cloud.Date>() { |
| 88 | + public static final Converter<LocalDate, com.google.cloud.Date> |
| 89 | + LOCAL_DATE_TIMESTAMP_CONVERTER = new Converter<LocalDate, com.google.cloud.Date>() { |
88 | 90 | // @formatter:on
|
89 | 91 | @Nullable
|
90 | 92 | @Override
|
91 |
| - public com.google.cloud.Date convert(java.util.Date date) { |
92 |
| - Calendar cal = Calendar.getInstance(); |
93 |
| - cal.setTime(date); |
94 |
| - return com.google.cloud.Date.fromYearMonthDay(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, |
95 |
| - cal.get(Calendar.DAY_OF_MONTH)); |
| 93 | + public com.google.cloud.Date convert(LocalDate date) { |
| 94 | + return com.google.cloud.Date.fromYearMonthDay(date.getYear(), date.getMonthValue(), date.getDayOfMonth()); |
96 | 95 | }
|
97 | 96 | };
|
98 | 97 |
|
99 | 98 | /**
|
100 |
| - * A converter from the Spanner date type to {@link java.util.Date}. |
| 99 | + * A converter from the Spanner date type to {@link LocalDate}. |
101 | 100 | */
|
102 | 101 | // @formatter:off
|
103 |
| - public static final Converter<com.google.cloud.Date, java.util.Date> SPANNER_TO_JAVA_DATE_CONVERTER = |
104 |
| - new Converter<com.google.cloud.Date, java.util.Date>() { |
| 102 | + public static final Converter<com.google.cloud.Date, LocalDate> TIMESTAMP_LOCAL_DATE_CONVERTER = |
| 103 | + new Converter<com.google.cloud.Date, LocalDate>() { |
105 | 104 | // @formatter:on
|
106 | 105 | @Nullable
|
107 | 106 | @Override
|
108 |
| - public java.util.Date convert(com.google.cloud.Date date) { |
109 |
| - Calendar cal = Calendar.getInstance(); |
110 |
| - cal.set(date.getYear(), date.getMonth() - 1, date.getDayOfMonth()); |
111 |
| - return cal.getTime(); |
| 107 | + public LocalDate convert(com.google.cloud.Date date) { |
| 108 | + return LocalDate.of(date.getYear(), date.getMonth(), date.getDayOfMonth()); |
112 | 109 | }
|
113 | 110 | };
|
114 | 111 |
|
| 112 | + /** |
| 113 | + * A converter from {@link LocalDateTime} to the Spanner timestamp type. |
| 114 | + */ |
| 115 | + // @formatter:off |
| 116 | + public static final Converter<LocalDateTime, Timestamp> |
| 117 | + LOCAL_DATE_TIME_TIMESTAMP_CONVERTER = new Converter<LocalDateTime, Timestamp>() { |
| 118 | + // @formatter:on |
| 119 | + @Nullable |
| 120 | + @Override |
| 121 | + public Timestamp convert(LocalDateTime dateTime) { |
| 122 | + return JAVA_TO_SPANNER_TIMESTAMP_CONVERTER.convert(java.sql.Timestamp.valueOf(dateTime)); |
| 123 | + } |
| 124 | + }; |
| 125 | + |
| 126 | + /** |
| 127 | + * A converter from the Spanner timestamp type to {@link LocalDateTime}. |
| 128 | + */ |
| 129 | + // @formatter:off |
| 130 | + public static final Converter<Timestamp, LocalDateTime> TIMESTAMP_LOCAL_DATE_TIME_CONVERTER = |
| 131 | + new Converter<Timestamp, LocalDateTime>() { |
| 132 | + // @formatter:on |
| 133 | + @Nullable |
| 134 | + @Override |
| 135 | + public LocalDateTime convert(Timestamp timestamp) { |
| 136 | + return SPANNER_TO_JAVA_TIMESTAMP_CONVERTER.convert(timestamp).toLocalDateTime(); |
| 137 | + } |
| 138 | + }; |
| 139 | + |
| 140 | + /** |
| 141 | + * A converter from {@link java.util.Date} to the Spanner timestamp type. |
| 142 | + */ |
| 143 | + // @formatter:off |
| 144 | + public static final Converter<java.util.Date, Timestamp> |
| 145 | + DATE_TIMESTAMP_CONVERTER = new Converter<java.util.Date, Timestamp>() { |
| 146 | + // @formatter:on |
| 147 | + @Nullable |
| 148 | + @Override |
| 149 | + public Timestamp convert(java.util.Date date) { |
| 150 | + long time = date.getTime(); |
| 151 | + long secs = Math.floorDiv(time, 1000L); |
| 152 | + int nanos = Math.toIntExact((time - secs * 1000L) * 1000000L); |
| 153 | + return Timestamp.ofTimeSecondsAndNanos(secs, nanos); |
| 154 | + } |
| 155 | + }; |
| 156 | + |
| 157 | + /** |
| 158 | + * A converter from the Spanner timestamp type to {@link java.util.Date}. |
| 159 | + */ |
| 160 | + // @formatter:off |
| 161 | + public static final Converter<Timestamp, java.util.Date> TIMESTAMP_DATE_CONVERTER = |
| 162 | + new Converter<Timestamp, java.util.Date>() { |
| 163 | + // @formatter:on |
| 164 | + @Nullable |
| 165 | + @Override |
| 166 | + public java.util.Date convert(Timestamp timestamp) { |
| 167 | + return timestamp.toDate(); |
| 168 | + } |
| 169 | + }; |
115 | 170 | /**
|
116 | 171 | * A converter from {@link Instant} to the Spanner instantaneous time type.
|
117 | 172 | */
|
@@ -151,8 +206,7 @@ public Instant convert(Timestamp timestamp) {
|
151 | 206 | @Override
|
152 | 207 | public Timestamp convert(java.sql.Timestamp timestamp) {
|
153 | 208 | long secs = Math.floorDiv(timestamp.getTime(), 1000L);
|
154 |
| - int nanos = timestamp.getNanos(); |
155 |
| - return Timestamp.ofTimeSecondsAndNanos(secs, nanos); |
| 209 | + return Timestamp.ofTimeSecondsAndNanos(secs, timestamp.getNanos()); |
156 | 210 | }
|
157 | 211 | };
|
158 | 212 |
|
@@ -201,18 +255,22 @@ public byte[] convert(ByteArray bytes) {
|
201 | 255 | /** Converters from common types to those used by Spanner. */
|
202 | 256 | public static final Collection<Converter> DEFAULT_SPANNER_WRITE_CONVERTERS = Collections.unmodifiableCollection(
|
203 | 257 | Arrays.asList(
|
204 |
| - JAVA_TO_SPANNER_DATE_CONVERTER, |
| 258 | + DATE_TIMESTAMP_CONVERTER, |
205 | 259 | INSTANT_TIMESTAMP_CONVERTER,
|
206 | 260 | JAVA_TO_SPANNER_BYTE_ARRAY_CONVERTER,
|
207 | 261 | JAVA_TO_SPANNER_TIMESTAMP_CONVERTER,
|
208 |
| - JAVA_SQL_TO_SPANNER_DATE_CONVERTER)); |
| 262 | + JAVA_SQL_TO_SPANNER_DATE_CONVERTER, |
| 263 | + LOCAL_DATE_TIMESTAMP_CONVERTER, |
| 264 | + LOCAL_DATE_TIME_TIMESTAMP_CONVERTER)); |
209 | 265 |
|
210 | 266 | /** Converters from common types to those used by Spanner. */
|
211 | 267 | public static final Collection<Converter> DEFAULT_SPANNER_READ_CONVERTERS = Collections.unmodifiableCollection(
|
212 | 268 | Arrays.asList(
|
213 |
| - SPANNER_TO_JAVA_DATE_CONVERTER, |
| 269 | + TIMESTAMP_DATE_CONVERTER, |
214 | 270 | TIMESTAMP_INSTANT_CONVERTER,
|
215 | 271 | SPANNER_TO_JAVA_BYTE_ARRAY_CONVERTER,
|
216 | 272 | SPANNER_TO_JAVA_TIMESTAMP_CONVERTER,
|
217 |
| - SPANNER_TO_JAVA_SQL_DATE_CONVERTER)); |
| 273 | + SPANNER_TO_JAVA_SQL_DATE_CONVERTER, |
| 274 | + TIMESTAMP_LOCAL_DATE_CONVERTER, |
| 275 | + TIMESTAMP_LOCAL_DATE_TIME_CONVERTER)); |
218 | 276 | }
|
0 commit comments