time: let time.parse_rfc3339('2015-01-06T15:47:32.080254511Z') succeed (dockerd timestamps, Go's RFC3339Nano).
							parent
							
								
									a0a3499bdc
								
							
						
					
					
						commit
						084f2867b6
					
				| 
						 | 
				
			
			@ -193,24 +193,46 @@ fn parse_iso8601_time(s string) ?(int, int, int, int, i64, bool) {
 | 
			
		|||
	hour_ := 0
 | 
			
		||||
	minute_ := 0
 | 
			
		||||
	second_ := 0
 | 
			
		||||
	microsecond_ := 0
 | 
			
		||||
	mut microsecond_ := 0
 | 
			
		||||
	mut nanosecond_ := 0
 | 
			
		||||
	plus_min_z := `a`
 | 
			
		||||
	offset_hour := 0
 | 
			
		||||
	offset_minute := 0
 | 
			
		||||
	mut count := unsafe {
 | 
			
		||||
		C.sscanf(&char(s.str), c'%2d:%2d:%2d.%6d%c%2d:%2d', &hour_, &minute_, &second_,
 | 
			
		||||
			µsecond_, &char(&plus_min_z), &offset_hour, &offset_minute)
 | 
			
		||||
	mut count := 0
 | 
			
		||||
	count = unsafe {
 | 
			
		||||
		C.sscanf(&char(s.str), c'%2d:%2d:%2d.%9d%c', &hour_, &minute_, &second_, &nanosecond_,
 | 
			
		||||
			&char(&plus_min_z))
 | 
			
		||||
	}
 | 
			
		||||
	// Missread microsecond ([Sec Hour Minute].len == 3 < 4)
 | 
			
		||||
	if count < 4 {
 | 
			
		||||
		count = unsafe {
 | 
			
		||||
			C.sscanf(&char(s.str), c'%2d:%2d:%2d%c%2d:%2d', &hour_, &minute_, &second_,
 | 
			
		||||
				&char(&plus_min_z), &offset_hour, &offset_minute)
 | 
			
		||||
	if count == 5 && plus_min_z == `Z` {
 | 
			
		||||
		// normalise the nanoseconds:
 | 
			
		||||
		mut ndigits := 0
 | 
			
		||||
		if mut pos := s.index('.') {
 | 
			
		||||
			pos++
 | 
			
		||||
			for ; pos < s.len && s[pos].is_digit(); pos++ {
 | 
			
		||||
				ndigits++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		for ndigits < 9 {
 | 
			
		||||
			nanosecond_ *= 10
 | 
			
		||||
			ndigits++
 | 
			
		||||
		}
 | 
			
		||||
		microsecond_ = nanosecond_ / 1000
 | 
			
		||||
	} else {
 | 
			
		||||
		count = unsafe {
 | 
			
		||||
			C.sscanf(&char(s.str), c'%2d:%2d:%2d.%6d%c%2d:%2d', &hour_, &minute_, &second_,
 | 
			
		||||
				µsecond_, &char(&plus_min_z), &offset_hour, &offset_minute)
 | 
			
		||||
		}
 | 
			
		||||
		// Missread microsecond ([Sec Hour Minute].len == 3 < 4)
 | 
			
		||||
		if count < 4 {
 | 
			
		||||
			count = unsafe {
 | 
			
		||||
				C.sscanf(&char(s.str), c'%2d:%2d:%2d%c%2d:%2d', &hour_, &minute_, &second_,
 | 
			
		||||
					&char(&plus_min_z), &offset_hour, &offset_minute)
 | 
			
		||||
			}
 | 
			
		||||
			count++ // Increment count because skipped microsecond
 | 
			
		||||
		}
 | 
			
		||||
		if count < 4 {
 | 
			
		||||
			return error_invalid_time(10)
 | 
			
		||||
		}
 | 
			
		||||
		count++ // Increment count because skipped microsecond
 | 
			
		||||
	}
 | 
			
		||||
	if count < 4 {
 | 
			
		||||
		return error_invalid_time(10)
 | 
			
		||||
	}
 | 
			
		||||
	is_local_time := plus_min_z == `a` && count == 4
 | 
			
		||||
	is_utc := plus_min_z == `Z` && count == 5
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,6 +3,7 @@ import time
 | 
			
		|||
fn test_parse() {
 | 
			
		||||
	s := '2018-01-27 12:48:34'
 | 
			
		||||
	t := time.parse(s) or {
 | 
			
		||||
		eprintln('> failing format: $s | err: $err')
 | 
			
		||||
		assert false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -23,6 +24,7 @@ fn test_parse_invalid() {
 | 
			
		|||
fn test_parse_rfc2822() {
 | 
			
		||||
	s1 := 'Thu, 12 Dec 2019 06:07:45 GMT'
 | 
			
		||||
	t1 := time.parse_rfc2822(s1) or {
 | 
			
		||||
		eprintln('> failing format: $s1 | err: $err')
 | 
			
		||||
		assert false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -31,6 +33,7 @@ fn test_parse_rfc2822() {
 | 
			
		|||
	assert t1.unix == 1576130865
 | 
			
		||||
	s2 := 'Thu 12 Dec 2019 06:07:45 +0800'
 | 
			
		||||
	t2 := time.parse_rfc2822(s2) or {
 | 
			
		||||
		eprintln('> failing format: $s2 | err: $err')
 | 
			
		||||
		assert false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -67,6 +70,7 @@ fn test_parse_iso8601() {
 | 
			
		|||
	]
 | 
			
		||||
	for i, format in formats {
 | 
			
		||||
		t := time.parse_iso8601(format) or {
 | 
			
		||||
			eprintln('>>> failing format: $format | err: $err')
 | 
			
		||||
			assert false
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -90,6 +94,7 @@ fn test_parse_iso8601() {
 | 
			
		|||
fn test_parse_iso8601_local() {
 | 
			
		||||
	format := '2020-06-05T15:38:06.015959'
 | 
			
		||||
	t := time.parse_iso8601(format) or {
 | 
			
		||||
		eprintln('> failing format: $format | err: $err')
 | 
			
		||||
		assert false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -127,6 +132,7 @@ fn test_parse_iso8601_invalid() {
 | 
			
		|||
fn test_parse_iso8601_date_only() {
 | 
			
		||||
	format := '2020-06-05'
 | 
			
		||||
	t := time.parse_iso8601(format) or {
 | 
			
		||||
		eprintln('> failing format: $format | err: $err')
 | 
			
		||||
		assert false
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -161,3 +167,20 @@ fn test_invalid_dates_should_error_during_parse() {
 | 
			
		|||
	check_invalid_date('2008-12-01 00:60:00')
 | 
			
		||||
	check_invalid_date('2008-12-01 00:01:60')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_parse_rfc3339() {
 | 
			
		||||
	pairs := [
 | 
			
		||||
		['2015-01-06T15:47:32.080254511Z', '2015-01-06 15:47:32.080254'],
 | 
			
		||||
		['2015-01-06T15:47:32.072697474Z', '2015-01-06 15:47:32.072697'],
 | 
			
		||||
	]
 | 
			
		||||
	for pair in pairs {
 | 
			
		||||
		input, expected := pair[0], pair[1]
 | 
			
		||||
		res := time.parse_rfc3339(input) or {
 | 
			
		||||
			eprintln('>>> failing input: $input | err: $err')
 | 
			
		||||
			assert false
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		output := res.format_ss_micro()
 | 
			
		||||
		assert expected == output
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue