1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 # This module contains some commonly used time conversion function. 6 7 import datetime 8 import time 9 10 11 # This format is used to parse datetime value in MySQL database and should not 12 # be modified. 13 TIME_FMT = '%Y-%m-%d %H:%M:%S' 14 TIME_FMT_MICRO = '%Y-%m-%d %H:%M:%S.%f' 15 16 def time_string_to_datetime(time_string, handle_type_error=False): 17 """Convert a string of time to a datetime object. 18 19 The format of date string must match '%Y-%m-%d %H:%M:%S' or 20 '%Y-%m-%d %H:%M:%S.%f'. 21 22 @param time_string: String of date, e.g., 2014-12-05 15:32:45 23 @param handle_type_error: Set to True to prevent the method raise 24 TypeError if given time_string is corrupted. Default is False. 25 26 @return: A datetime object with time of the given date string. 27 28 """ 29 try: 30 try: 31 return datetime.datetime.strptime(time_string, TIME_FMT) 32 except ValueError: 33 return datetime.datetime.strptime(time_string, TIME_FMT_MICRO) 34 except TypeError: 35 if handle_type_error: 36 return None 37 else: 38 raise 39 40 41 def date_string_to_epoch_time(date_string): 42 """Parse a date time string into seconds since the epoch. 43 44 @param date_string: A string, formatted according to `TIME_FMT`. 45 46 @return The number of seconds since the UNIX epoch, as a float. 47 48 """ 49 return time.mktime(time.strptime(date_string, TIME_FMT)) 50 51 52 def epoch_time_to_date_string(epoch_time, fmt_string=TIME_FMT): 53 """Convert epoch time (float) to a human readable date string. 54 55 @param epoch_time The number of seconds since the UNIX epoch, as 56 a float. 57 @param fmt_string: A string describing the format of the datetime 58 string output. 59 60 @returns: string formatted in the following way: "yyyy-mm-dd hh:mm:ss" 61 """ 62 if epoch_time: 63 return datetime.datetime.fromtimestamp( 64 int(epoch_time)).strftime(fmt_string) 65 return None 66 67 68 def to_epoch_time(value): 69 """Convert the given value to epoch time. 70 71 Convert the given value to epoch time if it is a datetime object or a string 72 can be converted to datetime object. 73 If the given value is a number, this function assume the value is a epoch 74 time value, and returns the value itself. 75 76 @param value: A datetime object or a number. 77 @returns: epoch time if value is datetime.datetime, 78 otherwise returns the value. 79 @raise ValueError: If value is not a datetime object or a number. 80 """ 81 if isinstance(value, basestring): 82 value = time_string_to_datetime(value) 83 if isinstance(value, datetime.datetime): 84 return time.mktime(value.timetuple()) + 0.000001 * value.microsecond 85 if not isinstance(value, int) and not isinstance(value, float): 86 raise ValueError('Value should be a datetime object, string or a ' 87 'number. Unexpected value: %s.' % value) 88 return value 89