50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			V
		
	
	
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
 | 
						|
// Use of this source code is governed by an MIT license
 | 
						|
// that can be found in the LICENSE file.
 | 
						|
module time
 | 
						|
 | 
						|
// parse returns time from a date string in "YYYY-MM-DD HH:MM:SS" format.
 | 
						|
pub fn parse(s string) ?Time {
 | 
						|
	pos := s.index(' ') or {
 | 
						|
		return error('Invalid time format: $s')
 | 
						|
	}
 | 
						|
	symd := s[..pos]
 | 
						|
	ymd := symd.split('-')
 | 
						|
	if ymd.len != 3 {
 | 
						|
		return error('Invalid time format: $s')
 | 
						|
	}
 | 
						|
	shms := s[pos..]
 | 
						|
	hms := shms.split(':')
 | 
						|
	hour := hms[0][1..]
 | 
						|
	minute := hms[1]
 | 
						|
	second := hms[2]
 | 
						|
 | 
						|
	res := new_time(Time{
 | 
						|
		year: ymd[0].int()
 | 
						|
		month: ymd[1].int()
 | 
						|
		day: ymd[2].int()
 | 
						|
		hour: hour.int()
 | 
						|
		minute: minute.int()
 | 
						|
		second: second.int()
 | 
						|
	})
 | 
						|
	return res
 | 
						|
}
 | 
						|
 | 
						|
// parse_rfc2822 returns time from a date string in RFC 2822 datetime format.
 | 
						|
pub fn parse_rfc2822(s string) ?Time {
 | 
						|
	fields := s.split(' ')
 | 
						|
	if fields.len < 5 {
 | 
						|
		return error('Invalid time format: $s')
 | 
						|
	}
 | 
						|
	pos := months_string.index(fields[2]) or {
 | 
						|
		return error('Invalid time format: $s')
 | 
						|
	}
 | 
						|
	mm := pos / 3 + 1
 | 
						|
	mut tmstr := byteptr(0)
 | 
						|
	unsafe { tmstr = malloc(s.len * 2) }
 | 
						|
	count := C.snprintf(charptr(tmstr), (s.len *  2), '%s-%02d-%s %s', fields[3].str, mm,
 | 
						|
		fields[1].str, fields[4].str)
 | 
						|
 | 
						|
	return parse(tos(tmstr, count))
 | 
						|
}
 |