将日期字符串解析为带时区的日期时间

2023-12-24

我有一个字符串:

r = 'Thu Dec 17 08:56:41 CST 2020'

这里CST代表中国中部时间('亚洲/上海')。我想将它解析为日期时间...我正在做类似的事情

from dateparser import parse
r1 = parse(r)

这给了我 r1 作为:

2020-12-17 08:56:41-06:00

而且我也在做这个

r2 = r1.replace(tzinfo=pytz.timezone("Asia/Shanghai"))

这给了我 r2 :

 2020-12-17 08:50:41+08:00

r2 有 6 分钟的延迟有人能告诉我为什么吗?以及如何正确地将我的原始字符串 r1 传输到所需的 r2 ,即:

2020-12-17 08:56:41 in Asia/Shanghai timezone

Thanks


Using dateutil.parser您可以直接正确解析您的日期。

注意CST是一个不明确的时区,因此您需要指定您所指的时区。您可以直接在tzinfos的参数parse()调用或者您可以定义一个具有时区映射的字典并传递它。在此字典中,您可以指定偏移量,例如

timezone_info = {
        "CDT": -5 * 3600,
        "CEST": 2 * 3600,
        "CST": 8 * 3600
}

parser.parse(r, tzinfos=timezone_info)

或(使用gettz) 直接指定时区:

timezone_info = {
        "CDT": gettz("America/Chicago"),
        "CEST": gettz("Europe/Berlin"),
        "CST": gettz("Asia/Shanghai")
}

parser.parse(r, tzinfos=timezone_info)

另请参阅dateutil.parser 文档 https://dateutil.readthedocs.io/en/stable/parser.html以及答案这个问题 https://stackoverflow.com/q/51206500/14015737.

请注意,如果您所在的位置实行夏令时,则后一种方法会很棘手!根据您申请的日期,gettz("America/Chicago")结果将是 UTC-5 或 UTC-6(因为芝加哥在中部标准时间和中部夏令时间之间切换)。因此,根据您的输入数据,第二个示例实际上可能并不正确并产生错误的结果!目前,中国全年遵守中国标准时间 (CST),因此对于您的用例而言,这没有什么区别(但可能取决于您的日期范围)。

Overall:

from dateutil import parser
from dateutil.tz import gettz

timezone_info = {"CST": gettz("Asia/Shanghai")}

r = 'Thu Dec 17 08:56:41 CST 2020'
d = parser.parse(r, tzinfos=timezone_info)

print(d)
print(d.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

gets you

2020-12-17 08:56:41+08:00
2020-12-17 08:56:41 CST+0800

EDIT:使用这种方法打印人类可读的时区名称而不是缩写的名称只是稍微复杂一点,因为dateutil.tz.gettz()给你一个tzfile没有属性,只有名称。但是,您可以通过受保护的方式获取它_filename using split():

print(d.strftime('%Y-%m-%d %H:%M:%S') + " in " + "/".join(d.tzinfo._filename.split('/')[-2:]))

yields

2020-12-17 08:56:41+08:00 in Asia/Shanghai

这当然只有在你使用过的情况下才有效gettz()首先设置时区。

EDIT 2: 如果你know不管怎样,你所有的日期都是 CST,你也可以在解析时忽略时区。这会让你得到天真的(或无意识的)日期时间,然后你可以在其中添加人类可读的时区。您可以使用以下方法执行此操作replace()并指定时区,如上所示使用gettz()或使用timezone(()来自pytz module:

from dateutil import parser
from dateutil.tz import gettz
import pytz

r = 'Thu Dec 17 08:56:41 CST 2020'
d = parser.parse(r, ignoretz=True)

d_dateutil = d.replace(tzinfo=gettz('Asia/Shanghai'))
d_pytz = d.replace(tzinfo=pytz.timezone('Asia/Shanghai'))

请注意,根据您使用哪个模块添加时区信息,tzinfo不同。为了pytz对象,有一种更直接的方法以人类可读的形式访问时区:

print(type(d_dateutil.tzinfo))
print("/".join(d_dateutil.tzinfo._filename.split('/')[-2:]))

print(type(d_pytz.tzinfo))
print(d_pytz.tzinfo.zone)

produces

<class 'dateutil.tz.tz.tzfile'>
Asia/Shanghai
<class 'pytz.tzfile.Asia/Shanghai'>
Asia/Shanghai
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将日期字符串解析为带时区的日期时间 的相关文章

随机推荐

  • 使用 Python 3 将 LF 打印到 Windows 标准输出

    如何获得 n在 Windows 上打印到标准输出 此代码适用于 Python 2 但不适用于 Python 3 set sys stdout to binary mode on Windows import sys os msvcrt ms
  • jQuery:after() 和 insertAfter() 有什么区别

    jQuery 有一个 after 方法 也是一种 insertAfter 方法 他们之间有什么区别 我想我可以用 after 在选定的元素 或多个元素 之后插入元素 是对的吗 什么是 insertAfter for 它们是相互对立的 aft
  • 什么是软可达物体?

    我试图通过这篇 Java 中的软引用 文章来研究软引用的含义 https www baeldung com java soft references https www baeldung com java soft references 我
  • Windows Spark 错误 java.lang.NoClassDefFoundError:无法初始化类 org.apache.spark.storage.StorageUtils

    下载了最新的apache 3 2 0以及hadoop文件 java Java SE Development Kit 17 0 1 也已安装 我什至无法初始化 input import pyspark from pyspark sql imp
  • 移动大数字

    X 712360810625491574981234007851998使用链表表示 每个节点都是一个unsigned int 有没有快速的方法X lt lt 8罢工 gt X lt lt 591除了之外X 2 8罢工 gt X 2 591
  • pandas 到 gbq 声称架构不匹配,而架构完全相同。在 github 上,所有问题都声称已于 2017 年解决

    我试图通过 pandas 将一个表附加到另一个表 从 BigQuery 中提取数据并将其发送到不同的 BigQuery 数据集 虽然表架构完全相同 但我收到错误 请验证结构和 pandas gbq gbq InvalidSchema 请验证
  • 将字符串写入输出流

    我有几个正在实现的输出侦听器OutputStream 它可以是PrintStream写入标准输出或文件 也可以写入内存或任何其他输出目的地 因此 我指定OutputStream作为方法中的 一个 参数 现在 我已经收到了String 在这里
  • 缓冲输入流标记读取限制

    我正在学习如何使用输入流 我试图对 BufferedInputStream 使用标记 但是当我尝试重置时 出现以下异常 java io IOException Resetting to invalid mark 我认为这意味着我的标记读取限
  • Three.js 投影仪和射线对象

    我一直在尝试使用 Projector 和 Ray 类来进行一些碰撞检测演示 我开始尝试使用鼠标来选择对象或拖动它们 我看过使用这些对象的示例 但似乎没有一个注释能够解释 Projector 和 Ray 的某些方法到底在做什么 我有几个问题
  • 插入 USB 驱动器时启动 PowerShell 脚本

    有什么方法可以在 USB 驱动器插入 PC 时立即启动位于 USB 驱动器上的 PowerShell 脚本吗 它必须将所有 PDF 文件从 PC 复制到 USB 驱动器 但这不是问题 我唯一不知道的是如何在插入 USB 驱动器后立即启动脚本
  • Canvas.toDataURL() 解决方法?

    好的 我的一个朋友请我帮助他为他正在开发的移动网站创建一个画布绘画应用程序 然而 他无法将 画作 保存到服务器上 我做了一些检查 发现在当前版本的浏览器 基于 WebKIt IIRC 中 toDataURL 支持被随机丢弃 是否有任何解决方
  • 本地主机与真实IP地址

    本地主机和真实IP地址有什么区别 如果我使用访问应用程序http localhost 8080 index html and http 192 123 456 001 8080 index html 例如192 123 456 001是主机
  • ThreeJS:从屏幕 2D 坐标转换为相机近平面上的世界 3D 坐标? R73

    我在坐标转换方面遇到了一些麻烦 我在屏幕上有一个具有已知坐标 x y 的对象 我想将其转换为世界坐标 x y z 因为它将投影在相机的近平面上 到目前为止 我可以像这样在 Z 平面上进行投影 var vector new THREE Vec
  • 使 proj_api.h 可用于 pip install cartopy

    我正在尝试安装cartopy via pip install cartopy 我已经安装了proj 4它已经在这里放置了必要的文件 Downloads proj 4 9 2 ls l usr local include proj api h
  • 无法将计数标签放置在存在异常值的箱线图须处

    我试图将观察计数的标签放置在箱线图胡须的末端 但当存在异常值时它似乎不起作用 我尝试将最大 最小值与我认为计算出的晶须长度 四分位数 1 或四分位数 3 或 1 5 四分位数范围 进行比较 但标签既不会放置在最大 最小值处 也不会放置在胡须
  • 使用 awk 在文件中查找字符串

    所以我想从文件中抓取一个字符串 文件包含数据 Id Name CreationDate Comment 1 testing 19 10 11 created by jag 2 develop 19 10 12 created by jag
  • (FB Instant games) 我如何获取/设置屏幕分辨率?

    如何在移动 Facebook 应用程序或 Messenger 中获取 设置即时游戏的屏幕分辨率 我尝试通过 window screen width 和 window innerWidth 获得它 它返回了我360像素 但我在Chrome浏览
  • 了解 C++ 中的顺序一致性栅栏

    我正在阅读有关 C 中的内存顺序的内容 我可以很好地理解放松和获取 释放模型 但我正在努力解决顺序一致性问题 如果我没记错的话 从参考参数 https en cppreference com w cpp atomic memory orde
  • 如何使用CAGradientLayer绘制渐变色轮?

    我从这些链接中得到了一些参考 色轮背后的算法是什么 https stackoverflow com questions 4897181 what is the algorithm behind a color wheel 色轮背后的数学 h
  • 将日期字符串解析为带时区的日期时间

    我有一个字符串 r Thu Dec 17 08 56 41 CST 2020 这里CST代表中国中部时间 亚洲 上海 我想将它解析为日期时间 我正在做类似的事情 from dateparser import parse r1 parse r