# -*- coding: utf-8 -*- # !/usr/bin/env python import time import datetime from typing import Union, Tuple from dateutil.relativedelta import relativedelta from apilib.utils_string import basestring_type from typing import Optional """ 由于Python的_strptime会在多线程时出现bug,需要首先引入 import _strptime [0] https://stackoverflow.com/questions/2427240/thread-safe-equivalent-to-pythons-time-strptime """ def get_zero_time(the_datetime): zero_time = None if isinstance(the_datetime, datetime.date): str_time = the_datetime.strftime("%Y-%m-%d") + " 00:00:00" zero_time = datetime.datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S") return zero_time def get_tomorrow_zero_time(the_datetime): # type: (datetime)->datetime zero_time = None str_time = the_datetime.strftime("%Y-%m-%d") + " 00:00:00" zero_time = datetime.datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S") return zero_time + datetime.timedelta(days = 1) # 根据当前时间获取时间戳,返回整数 def generate_timestamp(): return long(time.time()) def generate_timestamp_ex(): return long(time.time() * 1000) def date_to_datetime(date, start_or_end): # type: (Union[basestring_type, datetime.date], str)->datetime.datetime if isinstance(date, basestring_type): date = datetime.datetime.strptime(date, '%Y-%m-%d') else: date = date if start_or_end == 'start': time_ = datetime.time.min elif start_or_end == 'end': time_ = datetime.time.max else: raise Exception('only `start` or `end` are allowed for argument `start_or_end` given %s' % (start_or_end,)) return datetime.datetime.combine(date, time_) def defaultTodayDate(x): return datetime.datetime.now().strftime('%Y-%m-%d') if x is None else x def date_to_datetime_floor(date = None): if date is None: return datetime.datetime.now() else: return date_to_datetime(date = date, start_or_end = 'start') def date_to_datetime_ceiling(date = None): if date is None: return datetime.datetime.now() else: return date_to_datetime(date = date, start_or_end = 'end') def datetime_range(dt): # type:(datetime.datetime)->Tuple[datetime.datetime, datetime.datetime] assert isinstance(dt, datetime.datetime) combine = datetime.datetime.combine date = dt.date() return combine(date, datetime.time.min), combine(date, datetime.time.max) def today_datetime_range(): return datetime_range(datetime.datetime.now()) def dt_to_timestamp(dt): return time.mktime(dt.timetuple()) def local2utc(local_time): time_struct = time.mktime(local_time.timetuple()) utc_st = datetime.datetime.utcfromtimestamp(time_struct) return utc_st timestamp_to_dt = datetime.datetime.fromtimestamp datetime_to_timestamp = dt_to_timestamp def today_format_str(): return datetime.datetime.now().strftime("%Y-%m-%d") def yesterday_format_str(): return (datetime.datetime.now() - datetime.timedelta(days = 1)).strftime('%Y-%m-%d') def the_day_before_yesterday_format_str(): return (datetime.datetime.now() - datetime.timedelta(days = 2)).strftime( '%Y-%m-%d') def this_month_format_str(): return datetime.datetime.now().strftime('%Y-%m') def last_month_format_str(): return (datetime.datetime.today() - relativedelta(months = 1)).strftime('%Y-%m') def timestamp_timeformat(timeStamp): return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timeStamp)) def first_day_datetime_of_month(date = None, time_format = '%Y-%m-%d %H:%M:%S'): # type: (Optional[datetime], Optional[str])->datetime if not date: date = datetime.datetime.now() return datetime.datetime.strptime('%s-%s-01 00:00:00' % (date.year, date.month), time_format) def to_datetime(ts_or_str, time_format="%Y-%m-%d %H:%M:%S"): if isinstance(ts_or_str, basestring): return datetime.datetime.strptime(ts_or_str, time_format) elif isinstance(ts_or_str, int) or isinstance(ts_or_str, long) or isinstance(ts_or_str, float): return datetime.datetime.fromtimestamp(ts_or_str) elif isinstance(ts_or_str, datetime.datetime): return ts_or_str else: assert False, u'参数错误' def to_timestamp(ts_or_str, time_format="%Y-%m-%d %H:%M:%S"): if isinstance(ts_or_str, basestring): return dt_to_timestamp(to_datetime(ts_or_str, time_format)) elif isinstance(ts_or_str, int) or isinstance(ts_or_str, long) or isinstance(ts_or_str, float): return ts_or_str elif isinstance(ts_or_str, datetime.datetime): return dt_to_timestamp(ts_or_str) else: assert False, '参数错误' def datetime_between_months(months = 6): begin = datetime.datetime.now() - relativedelta(months = months) begin = datetime.datetime(begin.year, begin.month, 1) end = datetime.datetime.now() + datetime.timedelta(hours = 1) return begin, end