Python3 根据时区获取时间,并计算时间差

文章针对学习和工作中数据库与服务器不在同一地,时间比较困难的问题展开。介绍了用Python解决该问题的方法,包括将服务器时间转为数据库所在时区时间进行比较,还提供了获取国家时区的函数,以方便项目中根据当前时间和数据库时间做相关操作。

学习和工作经常会遇到数据库和服务器不在一个地方的情况,那么当遇到时间比较时,就会很头疼,不清楚到底相差几个小时,这篇文章就解决这个问题。

先把所有的代码贴出来:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pytz  
import datetime  
import time

# 可以直接获取北京时间,简写
beijing_time = datetime.datetime.now(pytz.timezone('PRC'))
# 2019-05-28 16:43:37.265310+08:00

# 以洛杉矶为例,获取洛杉矶当地时间
los_angeles = datetime.datetime.now(pytz.timezone('America/Los_Angeles'))
# 2019-05-28 01:43:37.266825-07:00

# 获取时间差:洛杉矶时间--北京时间
# 格式化时间
los_angeles_timestamp = los_angeles.strftime('%Y-%m-%d %H:%M:%S')   # 2019-05-28 01:48:04
beijing_time_timestamp = beijing_time.strftime('%Y-%m-%d %H:%M:%S') # 2019-05-28 16:48:04

# 转为时间戳
now = time.strptime(beijing_time_timestamp,'%Y-%m-%d %H:%M:%S')
# time.struct_time(tm_year=2019, tm_mon=5, tm_mday=28, tm_hour=16, tm_min=50, tm_sec=45, tm_wday=1, tm_yday=148, tm_isdst=-1)

old = time.strptime(los_angeles_timestamp,'%Y-%m-%d %H:%M:%S')
# time.struct_time(tm_year=2019, tm_mon=5, tm_mday=28, tm_hour=1, tm_min=50, tm_sec=45, tm_wday=1, tm_yday=148, tm_isdst=-1)

# 时间戳相减
delta_seconds = time.mktime(now) - time.mktime(old) # 54000.0

print(delta_seconds / 3600) # 15.0 个小时

有需要的同学看到代码就差不多懂了,北京和洛杉矶相差了15个小时,当然这个数据也可以百度等方式知道,但是在做项目的时候,我们会根据当前时间和数据库时间做比较,然后执行一些相关操作;假如服务器在北京,数据库在美国洛杉矶,那么你用下面的方式做比较就相差的太大了:

datetime.datetime.now() - db_time

所以要把服务器的时间转为洛杉矶时间才可以作比较:

# 获取洛杉矶当地时间
los_angeles = datetime.datetime.now(pytz.timezone('America/Los_Angeles'))
# 2019-05-28 01:43:37.266825-07:00

这个才是重点!

如果想指定加几个小时,也就是类似上面的,把洛杉矶时间变为北京时间,可以这样:

datetime.datetime.now(PST) + datetime.timedelta(hours=15)

下面提供一个函数,获取国家的时区:

# 获取中国所有时区
all_cn_city = pytz.country_timezones('cn')
# 获取美国所有时区
all_us_city = pytz.country_timezones('us')

欢迎指导!

<think> 根据用户需求,用户需要两个功能: 1. 获取当前日期时间 2. 计算与目标日期相差时长 在Python中,我们可以使用datetime模块来实现这两个功能。 步骤1:导入datetime模块 步骤2:使用datetime.now()获取当前日期时间 步骤3:将目标日期字符串转换为datetime对象(用户需要提供目标日期) 步骤4:计算两个日期时间的差值(timedelta对象) 步骤5:从timedelta对象中提取天数、秒数等(如果需要具体的天、小时、分钟等) 注意:如果用户需要计算到目标日期的剩余天数(忽略时间),则可以使用日期(date)对象进行计算。 下面给出两种常见情况的代码示例: 情况1:计算两个日期时间(精确到秒)的差值,得到相差的天数、秒数(可以进一步转换为小时、分钟等) 情况2:计算两个日期(忽略时间)的差值,得到相差的天数 示例代码: ```python from datetime import datetime # 获取当前日期时间(精确到秒) current_datetime = datetime.now() # 目标日期时间(假设用户输入一个字符串,需要转换为datetime对象) target_str = "2024-12-31 23:59:59" # 将字符串转换为datetime对象,注意格式匹配 target_datetime = datetime.strptime(target_str, "%Y-%m-%d %H:%M:%S") # 计算时间差 time_difference = target_datetime - current_datetime # 提取时间差中的天数和秒数(秒数不包括天数部分,所以总秒数可以用total_seconds()) days = time_difference.days seconds = time_difference.seconds hours = seconds // 3600 minutes = (seconds % 3600) // 60 seconds_remaining = seconds % 60 print(f"距离目标时间还有: {days}天, {hours}小时, {minutes}分钟, {seconds_remaining}秒") # 如果只关心日期(不考虑时间),则可以使用date对象 current_date = datetime.now().date() target_date = datetime.strptime(target_str, "%Y-%m-%d %H:%M:%S").date() date_difference = target_date - current_date print(f"距离目标日期还有: {date_difference.days}天") ``` 注意:上面的代码中,目标日期字符串是硬编码的,实际使用时可能需要用户输入。 另外,如果用户需要的是从当前时间到目标时间时间差(以秒为单位),可以直接使用`total_seconds()`方法。 用户可能还需要考虑时区问题,但如果没有特别说明,一般使用本地时间即可。 如果用户需要更复杂的时间操作(如考虑时区),可以使用pytz库。 下面提供更完整的代码示例,包括用户输入和错误处理: ```python from datetime import datetime def main(): # 获取当前日期时间 current_datetime = datetime.now() print(f"当前时间是: {current_datetime.strftime(&#39;%Y-%m-%d %H:%M:%S&#39;)}") # 用户输入目标日期时间 target_str = input("请输入目标日期时间(格式:YYYY-MM-DD HH:MM:SS): ") try: # 尝试将输入字符串转换为datetime对象 target_datetime = datetime.strptime(target_str, "%Y-%m-%d %H:%M:%S") except ValueError: print("输入格式错误,请按照YYYY-MM-DD HH:MM:SS格式输入") return # 计算时间差 if target_datetime < current_datetime: time_difference = current_datetime - target_datetime print("目标时间已经过去:") else: time_difference = target_datetime - current_datetime print("距离目标时间还有:") # 提取天数和剩余的秒数 days = time_difference.days seconds = time_difference.seconds hours = seconds // 3600 minutes = (seconds % 3600) // 60 seconds_remaining = seconds % 60 print(f"{days}天, {hours}小时, {minutes}分钟, {seconds_remaining}秒") # 计算总秒数 total_seconds = time_difference.total_seconds() print(f"总计相差: {total_seconds:.0f}秒") if __name__ == "__main__": main() ``` 以上代码可以处理用户输入,计算当前时间与目标时间的差值,同时考虑了输入格式错误的情况。 如果用户只需要日期(不需要时间),可以修改为只输入日期,然后使用date对象进行计算,代码类似。 §§相关问题§§ 1. 如何将日期时间格式化为不同的字符串格式? 2. 如何处理带时区的日期时间3. 如何计算两个日期之间相差的工作日(排除周末)? </think>### Python获取当前日期时间计算与目标日期相差时长的方法 #### 1. 获取当前日期时间 使用`datetime`模块获取精确到秒的当前时间: ```python from datetime import datetime # 获取当前日期时间(精确到秒) current_time = datetime.now() print(f"当前时间: {current_time.strftime(&#39;%Y-%m-%d %H:%M:%S&#39;)}") ``` #### 2. 计算日期时间差 ##### 方法1:计算精确时间差(天/小时/分钟/秒) ```python from datetime import datetime def calculate_time_difference(target_str): # 目标日期字符串转datetime对象 target_time = datetime.strptime(target_str, "%Y-%m-%d %H:%M:%S") current_time = datetime.now() # 计算时间差(支持过去/未来时间) time_diff = target_time - current_time # 未来时间为正,过去为负 # 提取时间差分量 days = abs(time_diff.days) seconds = abs(time_diff.seconds) hours = seconds // 3600 minutes = (seconds % 3600) // 60 seconds = seconds % 60 return (days, hours, minutes, seconds, time_diff.days >= 0) # 示例使用 target = "2024-12-31 23:59:59" days, hours, mins, secs, is_future = calculate_time_difference(target) direction = "后" if is_future else "前" print(f"距离目标时间 {abs(days)}天{hours}小时{mins}分钟{secs}秒{direction}") ``` ##### 方法2:仅计算日期差(忽略时间) ```python from datetime import date current_date = date.today() target_date = date(2024, 12, 31) # 直接使用日期对象 date_diff = (target_date - current_date).days print(f"距离目标日期还有 {date_diff} 天") ``` #### 3. 关键函数说明 | 函数/方法 | 说明 | |--------------------------|----------------------------------------------------------------------| | `datetime.now()` | 获取当前日期时间(精确到微秒) | | `datetime.strptime()` | 将字符串解析为datetime对象(需匹配格式如`%Y-%m-%d %H:%M:%S`) | | `timedelta.days` | 获取时间差中的整天数 | | `timedelta.seconds` | 获取时间差中的秒数(不包括整天数) | | `timedelta.total_seconds()` | 获取完整的时间差总秒数 | | `date.today()` | 获取当前日期(忽略时间) | #### 4. 实用技巧 **格式化时间字符串**: ```python # 自定义输出格式 formatted = current_time.strftime("%Y年%m月%d日 %H时%M分") print(formatted) # 输出:2024年03月15日 14时30分 ``` **带时区处理**(使用`pytz`库): ```python import pytz from datetime import datetime # 获取上海时区当前时间 shanghai_time = datetime.now(pytz.timezone(&#39;Asia/Shanghai&#39;)) print("上海时间:", shanghai_time.strftime("%Y-%m-%d %H:%M:%S")) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值