python基于北京时间来运营的例子
# coding:utf-8
# @Author: zlq
"""
这个例子是基于北京时间来运营的
以北京时间为准, 不以服务器的当地时间为准, 这样方便运营
在线国际时区转换在线计算器:http://www.osgeo.cn/app/sc627
"""
"""
这个例子是以北京时间为准,存入数据库的是将本地时间转为北京东八区的时间戳,
然后展示的是显示本地时间, 相互对比的是从数据库拿出北京东八区的时间戳和当前时区
的时间戳转为北京东八区时间戳来对比,来计算有效时间
"""
# UTC时间转本地时间(+8:00)
def utc2local(utc_st):
now_stamp = time.time()
local_time = datetime.fromtimestamp(now_stamp)
utc_time = datetime.utcfromtimestamp(now_stamp)
offset = local_time - utc_time
local_st = utc_st + offset
return local_st
# 本地时间转UTC时间(-8:00)
def local2utc(local_st):
time_struct = time.mktime(local_st.timetuple())
utc_st = datetime.utcfromtimestamp(time_struct)
return utc_st
# 字符串形式日期转换为时间戳
def str2timestamp(date, format_str="%Y-%m-%d", zone=None):
"""
字符串形式日期转换为时间戳 ,默认格式"%Y-%m-%d"
转换出错默认返回 0
"""
timeArray = time.strptime(date, format_str)
if zone:
tz = timezone(zone)
y, m, d, H, M, S = timeArray[0:6]
dt = datetime(y, m, d, H, M, S)
t = tz.localize(dt)
t = t.astimezone(pytz.utc)
return int(time.mktime(t.utctimetuple())) - time.timezone
return int(time.mktime(timeArray))
def format_timestamp(timestamp, format_str='%Y-%m-%d %H:%M:%S', zone=None):
"""
unixtime 时间 转 字符串
默认:%Y-%m-%d %H:%M:%S
"""
if timestamp is None or not timestamp:
return ''
if format_str is 'isodate':
format_str = '%Y-%m-%d %H:%M:%S'
elif format_str in ('date', 'shortdate', 'short-date'):
format_str = '%Y-%m-%d'
elif format_str is 'time':
format_str = '%H:%M:%S'
if zone:
tz = timezone(zone)
t = pytz.utc.localize(datetime.utcfromtimestamp(timestamp))
t = t.astimezone(tz)
return t.strftime(format_str)
return datetime.fromtimestamp(timestamp).strftime(format_str)
# 服务器当前日期时间的时间戳和北京东八区对比, 就可以根据时间戳大小来
# 对比有效时间了, 这个结果是转为了现在北京东八区的时间戳。就可以拿这个结果
# 和预先存到数据库的北京东八区时间戳对比来返回有效链接了
def local_timezone_now_timestamp_compare_beijing():
# 相互对比的是从数据库拿出北京东八区的时间戳和当前时区
# 的时间戳转为北京东八区时间戳来对比
# 以时间戳形式判断。在当前时间段往回遍历生效链接,离现在最近的时间戳,
# 最终取得列表最大者就是离现在最近的时间戳,前端展示最近生效时间的链接
timezone_beijing = 'Asia/Shanghai'
beijing_datetime =format_timestamp(time.time(),
format_str="%Y-%m-%d %H:%M:%S",
zone=timezone_beijing)
# # 东八区
now_beijing_timestamp = str2timestamp(beijing_datetime,
format_str="%Y-%m-%d %H:%M:%S",
zone=timezone_beijing)
return now_beijing_timestamp
# 将通过页面设置的有效时间,转为东八区北京时间的时间戳,就可以保存到数据库了
def save_database_beijing_timstamp(effective_time_str):
"""
:param effective_time_str: "2018-06-19 19:22:24"
:return:
"""
timezone_beijing = 'Asia/Shanghai'
# 东八区
beijing_timestamp = str2timestamp(effective_time_str,
format_str="%Y-%m-%d %H:%M:%S",
zone=timezone_beijing)
return beijing_timestamp
# 将返回结果,展示到前端页面为北京时间
def show_frontweb_beijing_timedate(effective_timestamp):
"""
:param effective_timestamp: 1529525344
:return:
"""
timezone_beijing = "Asia/Shanghai"
effective_time_str = format_timestamp(effective_timestamp,
format='%Y-%m-%d %H:%M:%S',
zone=timezone_beijing)
return effective_time_str