@@ -198,6 +198,14 @@ object DateTimeUtils {
198198 * `yyyy-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]Z`
199199 * `yyyy-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]-[h]h:[m]m`
200200 * `yyyy-[m]m-[d]dT[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]+[h]h:[m]m`
201+ * `[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]`
202+ * `[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]Z`
203+ * `[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]-[h]h:[m]m`
204+ * `[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]+[h]h:[m]m`
205+ * `T[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]`
206+ * `T[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]Z`
207+ * `T[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]-[h]h:[m]m`
208+ * `T[h]h:[m]m:[s]s.[ms][ms][ms][us][us][us]+[h]h:[m]m`
201209 */
202210 def stringToTimestamp (s : UTF8String ): Long = {
203211 if (s == null ) {
@@ -210,15 +218,24 @@ object DateTimeUtils {
210218 val bytes = s.getBytes
211219 var j = 0
212220 var digitsMilli = 0
221+ var justTime = false
213222 while (j < bytes.length) {
214223 val b = bytes(j)
215224 val parsedValue = b - '0' .toByte
216225 if (parsedValue < 0 || parsedValue > 9 ) {
217- if (i < 2 ) {
226+ if (j == 0 && b == 'T' ) {
227+ justTime = true
228+ i += 3
229+ } else if (i < 2 ) {
218230 if (b == '-' ) {
219231 segments(i) = currentSegmentValue
220232 currentSegmentValue = 0
221233 i += 1
234+ } else if (i == 0 && b == ':' ) {
235+ justTime = true
236+ segments(3 ) = currentSegmentValue
237+ currentSegmentValue = 0
238+ i = 4
222239 } else {
223240 return null .asInstanceOf [Long ]
224241 }
@@ -287,7 +304,7 @@ object DateTimeUtils {
287304 if (segments(0 ) < 0 || segments(0 ) > 9999 || segments(1 ) < 1 || segments(1 ) > 12 ||
288305 segments(2 ) < 1 || segments(2 ) > 31 || segments(3 ) < 0 || segments(3 ) > 23 ||
289306 segments(4 ) < 0 || segments(4 ) > 59 || segments(5 ) < 0 || segments(5 ) > 59 ||
290- segments(6 ) < 0 || segments(6 ) > 999999 || segments(7 ) < 0 || segments(7 ) > 14 ||
307+ segments(6 ) < 0 || segments(6 ) > 999999 || segments(7 ) < 0 || segments(7 ) > 23 ||
291308 segments(8 ) < 0 || segments(8 ) > 59 ) {
292309 return null .asInstanceOf [Long ]
293310 }
@@ -297,14 +314,20 @@ object DateTimeUtils {
297314 Calendar .getInstance(
298315 TimeZone .getTimeZone(f " GMT ${timeZone.get.toChar}${segments(7 )}%02d: ${segments(8 )}%02d " ))
299316 }
300- c.set(segments(0 ), segments(1 ) - 1 , segments(2 ), segments(3 ), segments(4 ), segments(5 ))
317+ if (justTime) {
318+ c.set(Calendar .HOUR , segments(3 ))
319+ c.set(Calendar .MINUTE , segments(4 ))
320+ c.set(Calendar .SECOND , segments(5 ))
321+ } else {
322+ c.set(segments(0 ), segments(1 ) - 1 , segments(2 ), segments(3 ), segments(4 ), segments(5 ))
323+ }
301324 c.set(Calendar .MILLISECOND , segments(6 ) / 1000 )
302325 c.getTimeInMillis * 1000 + segments(6 ) % 1000
303326 }
304327
305328 /**
306- * Parses a given UTF8 date string to the corresponding [[ Date ]] object. The format of the date
307- * has to be one of the following:
329+ * Parses a given UTF8 date string to the corresponding number of days since 1.1.1970.
330+ * The format of the date has to be one of the following:
308331 * `yyyy`,
309332 * `yyyy-[m]m`
310333 * `yyyy-[m]m-[d]d`
0 commit comments