@@ -145,7 +145,7 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
145
145
}
146
146
147
147
if ( java .sql .Timestamp .class .isAssignableFrom ( type ) ) {
148
- return new java .sql .Timestamp ( value . getTime ( ) );
148
+ return new java .sql .Timestamp ( unwrapDateEpoch ( value ) );
149
149
}
150
150
151
151
if ( java .sql .Time .class .isAssignableFrom ( type ) ) {
@@ -158,18 +158,31 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
158
158
private LocalDate unwrapLocalDate (Date value ) {
159
159
return value instanceof java .sql .Date
160
160
? ( (java .sql .Date ) value ).toLocalDate ()
161
- : new java .sql .Date ( value . getTime ( ) ).toLocalDate ();
161
+ : new java .sql .Date ( unwrapDateEpoch ( value ) ).toLocalDate ();
162
162
}
163
163
164
164
private java .sql .Date unwrapSqlDate (Date value ) {
165
- return value instanceof java .sql .Date
166
- ? (java .sql .Date ) value
167
- : new java .sql .Date ( value .getTime () );
165
+ if ( value instanceof java .sql .Date ) {
166
+ final java .sql .Date sqlDate = (java .sql .Date ) value ;
167
+ final long dateEpoch = toDateEpoch ( sqlDate .getTime () );
168
+ return dateEpoch == sqlDate .getTime () ? sqlDate : new java .sql .Date ( dateEpoch );
169
+ }
170
+ return new java .sql .Date ( unwrapDateEpoch ( value ) );
168
171
169
172
}
170
173
171
174
private static long unwrapDateEpoch (Date value ) {
172
- return value .getTime ();
175
+ return toDateEpoch ( value .getTime () );
176
+ }
177
+
178
+ private static long toDateEpoch (long value ) {
179
+ Calendar calendar = Calendar .getInstance ();
180
+ calendar .setTimeInMillis ( value );
181
+ calendar .set (Calendar .HOUR_OF_DAY , 0 );
182
+ calendar .clear (Calendar .MINUTE );
183
+ calendar .clear (Calendar .SECOND );
184
+ calendar .clear (Calendar .MILLISECOND );
185
+ return calendar .getTimeInMillis ();
173
186
}
174
187
175
188
@ Override
@@ -183,15 +196,15 @@ public Date wrap(Object value, WrapperOptions options) {
183
196
}
184
197
185
198
if ( value instanceof Long ) {
186
- return new java .sql .Date ( ( Long ) value );
199
+ return new java .sql .Date ( toDateEpoch ( ( Long ) value ) );
187
200
}
188
201
189
202
if ( value instanceof Calendar ) {
190
- return new java .sql .Date ( ( (Calendar ) value ).getTimeInMillis () );
203
+ return new java .sql .Date ( toDateEpoch ( ( ( Calendar ) value ).getTimeInMillis () ) );
191
204
}
192
205
193
206
if ( value instanceof Date ) {
194
- return new java . sql . Date ( ( ( Date ) value ). getTime () );
207
+ return unwrapSqlDate ( (Date ) value );
195
208
}
196
209
197
210
if ( value instanceof LocalDate ) {
0 commit comments