Parses a time of any of forms - `09:26:56` - `09:26:56.123` - `09:26:56.123456` - `09:26:56.123456789` - `092656` Returning the end byte offset
(&self)
| 91 | /// |
| 92 | /// Returning the end byte offset |
| 93 | fn time(&self) -> Option<(NaiveTime, usize)> { |
| 94 | // Make a NaiveTime handling leap seconds |
| 95 | let time = |hour, min, sec, nano| match sec { |
| 96 | 60 => { |
| 97 | let nano = 1_000_000_000 + nano; |
| 98 | NaiveTime::from_hms_nano_opt(hour as _, min as _, 59, nano) |
| 99 | } |
| 100 | _ => NaiveTime::from_hms_nano_opt(hour as _, min as _, sec as _, nano), |
| 101 | }; |
| 102 | |
| 103 | match (self.mask >> 11) & 0b11111111 { |
| 104 | // 09:26:56 |
| 105 | 0b11011011 if self.test(13, b':') && self.test(16, b':') => { |
| 106 | let hour = self.digits[11] * 10 + self.digits[12]; |
| 107 | let minute = self.digits[14] * 10 + self.digits[15]; |
| 108 | let second = self.digits[17] * 10 + self.digits[18]; |
| 109 | |
| 110 | match self.test(19, b'.') { |
| 111 | true => { |
| 112 | let digits = (self.mask >> 20).trailing_ones(); |
| 113 | let nanos = match digits { |
| 114 | 0 => return None, |
| 115 | 1 => parse_nanos::<1, 0>(&self.digits[20..21]), |
| 116 | 2 => parse_nanos::<2, 0>(&self.digits[20..22]), |
| 117 | 3 => parse_nanos::<3, 0>(&self.digits[20..23]), |
| 118 | 4 => parse_nanos::<4, 0>(&self.digits[20..24]), |
| 119 | 5 => parse_nanos::<5, 0>(&self.digits[20..25]), |
| 120 | 6 => parse_nanos::<6, 0>(&self.digits[20..26]), |
| 121 | 7 => parse_nanos::<7, 0>(&self.digits[20..27]), |
| 122 | 8 => parse_nanos::<8, 0>(&self.digits[20..28]), |
| 123 | _ => parse_nanos::<9, 0>(&self.digits[20..29]), |
| 124 | }; |
| 125 | Some((time(hour, minute, second, nanos)?, 20 + digits as usize)) |
| 126 | } |
| 127 | false => Some((time(hour, minute, second, 0)?, 19)), |
| 128 | } |
| 129 | } |
| 130 | // 092656 |
| 131 | 0b111111 => { |
| 132 | let hour = self.digits[11] * 10 + self.digits[12]; |
| 133 | let minute = self.digits[13] * 10 + self.digits[14]; |
| 134 | let second = self.digits[15] * 10 + self.digits[16]; |
| 135 | let time = time(hour, minute, second, 0)?; |
| 136 | Some((time, 17)) |
| 137 | } |
| 138 | _ => None, |
| 139 | } |
| 140 | } |
| 141 | } |
| 142 | |
| 143 | /// Accepts a string and parses it relative to the provided `timezone` |