123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- # -*- 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
- def last_day_datetime_of_this_month(inputTime = None):
- if not inputTime:
- inputTime = datetime.datetime.now()
- nextMonthDay = inputTime + relativedelta(months = 1)
- return first_day_datetime_of_month(nextMonthDay) - datetime.timedelta(days=1)
- def get_month_days(year, month):
- """
- 获取一个月的所有天的列表
- :param year: 年份
- :param month: 月份
- :return: 该月所有天的列表
- """
- # 获取该月的第一天
- first_day = datetime.date(year, month, 1)
- # 获取该月的下一个月的第一天
- next_month = datetime.date(year, month + 1, 1) if month != 12 else datetime.date(year + 1, 1, 1)
- # 生成该月所有天的列表
- days = [(first_day + datetime.timedelta(days=i)).day for i in range((next_month - first_day).days)]
- return days
|