天道酬勤,学无止境

更改日期对象 Python 的时区(Change Timezone for Date object Python)

问题

你好,我正在使用 Pythonanywhere,当我打电话时

from datetime import *

print date.today().day

它打印的日期与我居住的地方(德克萨斯州奥斯汀)不同。 我认为这是因为存在时区差异。 我如何告诉日期对象我住在哪里,以便它获得正确的时区。 提前致谢

回答1

最可靠的方法是使用pytz 。 您可以简单地使用pip install pytz安装它。

要使用pytz获取本地日期,您可以简单地执行此操作(注意date.today方法不会采用时区):

>>> from datetime import datetime
>>> import pytz
>>> local_date = datetime.now(pytz.timezone('US/Central'))  # use datetime here
>>> local_date.date()                                       # now call date method
datetime.date(2014, 11, 30)

将其与当前的格林威治日期进行比较:

>>> greenwich_date = datetime.now(pytz.timezone('Etc/Greenwich'))
>>> greenwich_date.date()
datetime.date(2014, 12, 1)
回答2

在标准库中,没有跨平台的方式来创建感知时区而不创建自己的时区类。 pytz 库具有大多数时区的最新数据库。 因此,您可以这样做:

import pytz
from datetime import datetime
datetime.now(pytz.utc)

.utc为您提供本地化时区,但您可能希望使用.timezone()方法显式提供另一个时区。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 显示没有时间的Python日期时间(Display Python datetime without time)
    问题 我有一个日期字符串,并想将其转换为日期类型: 我尝试将datetime.datetime.strptime与所需的格式一起使用,但它会返回转换时间。 when = alldates[int(daypos[0])] print when, type(when) then = datetime.datetime.strptime(when, '%Y-%m-%d') print then, type(then) 这是输出返回的内容: 2013-05-07 <type 'str'> 2013-05-07 00:00:00 <type 'datetime.datetime'> 我需要删除时间:00:00:00。 回答1 print then.date() 您想要的是一个datetime.date对象。 您拥有的是一个datetime.datetime对象。 您可以按照上面的说明在更改对象时进行更改,或者在创建对象时执行以下操作: then = datetime.datetime.strptime(when, '%Y-%m-%d').date() 回答2 >>> print then.date(), type(then.date()) 2013-05-07 <type 'datetime.date'> 回答3 如果您希望结果是时区感知的,则可以使用datetime对象的replace(
  • Python UTC日期时间对象的ISO格式不包含Z(Zulu或零偏移量)(Python UTC datetime object's ISO format doesn't include Z (Zulu or Zero offset))
    问题 为什么python 2.7不像JavaScript那样在UTC日期时间对象的isoformat字符串的末尾不包含Z字符(Zulu或零偏移)? >>> datetime.datetime.utcnow().isoformat() '2013-10-29T09:14:03.895210' 而在javascript中 >>> console.log(new Date().toISOString()); 2013-10-29T09:38:41.341Z 回答1 Python datetime时间对象默认情况下没有时区信息,没有它,Python实际上违反了ISO 8601规范(如果未提供时区信息,则假定为本地时间)。 您可以使用pytz包来获取一些默认时区,或者自己直接将tzinfo子类化: from datetime import datetime, tzinfo, timedelta class simple_utc(tzinfo): def tzname(self,**kwargs): return "UTC" def utcoffset(self, dt): return timedelta(0) 然后,您可以将时区信息手动添加到utcnow() : >>> datetime.utcnow().replace(tzinfo=simple_utc()).isoformat()
  • 如何在Python中获取当前时间(How to get the current time in Python)
    问题 获取当前时间的模块/方法是什么? 回答1 采用: >>> import datetime >>> datetime.datetime.now() datetime.datetime(2009, 1, 6, 15, 8, 24, 78915) >>> print(datetime.datetime.now()) 2009-01-06 15:08:24.789150 而只是时间: >>> datetime.datetime.now().time() datetime.time(15, 8, 24, 78915) >>> print(datetime.datetime.now().time()) 15:08:24.789150 有关更多信息,请参见文档。 要保存类型,可以从datetime模块导入datetime对象: >>> from datetime import datetime 然后删除前导datetime. 以上所有。 回答2 您可以使用time.strftime(): >>> from time import gmtime, strftime >>> strftime("%Y-%m-%d %H:%M:%S", gmtime()) '2009-01-05 22:14:39' 回答3 from datetime import datetime datetime.now()
  • Django根据每个对象时区保存日期时间(Django saving datetime based on per object timezone)
    问题 对于我的大多数应用程序,使用 TIME_ZONE 和 USE_TZ 设置保存日期时间都很好。 我的问题是,如何使用 UTC 中的日期时间保存模型,但设置了日期时间以便转换回用户输入的时区是正确的? 下面给出模型、视图、表单和 html。 如果 settings.py 文件中的 USE_TZ = False ,此代码将起作用,但我想保留项目中其他所有内容的时区。 模型: class TZTestModel(models.Model): timezone = TimeZoneField() dt = models.DateTimeField() 看法: class TZTestView(LoginRequiredMixin, TemplateView): template_name = "tz_test.html" def get_context_data(self, **kwargs): return { 'form': self.form } def dispatch(self, request, *args, **kwargs): self.form = TZTestForm(self.request.POST or None) return super(TZTestView, self).dispatch(request, *args, **kwargs) def
  • 如何将本地时间字符串转换为UTC?(How to convert local time string to UTC?)
    问题 如何将本地时间的datetime字符串转换为UTC时间的字符串? 我确定我之前已经做过,但是找不到它,因此SO希望将来可以帮助我(和其他人)做到这一点。 说明:例如,如果我在本地时区( +10 )中有2008-09-17 14:02:00 ,我想生成一个具有等效UTC时间的字符串: 2008-09-17 04:02:00 。 另外,请参阅http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/,通常这是不可能的,因为DST和其他问题没有从本地时间到UTC时间。 回答1 首先,将字符串解析为一个朴素的datetime对象。 这是datetime.datetime的实例,没有附加的时区信息。 请参阅其文档。 使用pytz模块,该模块随附时区+ UTC的完整列表。 弄清楚本地时区是什么,从中构造一个时区对象,然后将其操纵并附加到原始日期时间。 最后,使用datetime.astimezone()方法将datetime转换为UTC。 使用本地时区“ America / Los_Angeles”的字符串“ 2001-2-3 10:11:12”的源代码: from datetime import datetime import pytz local = pytz.timezone("America/Los_Angeles") naive =
  • Python和JavaScript之间的JSON日期时间(JSON datetime between Python and JavaScript)
    问题 我想使用JSON从Python发送序列化形式的datetime.datetime对象,并使用JSON在JavaScript中反序列化。 做这个的最好方式是什么? 回答1 您可以在json.dumps中添加“默认”参数来处理此问题: date_handler = lambda obj: ( obj.isoformat() if isinstance(obj, (datetime.datetime, datetime.date)) else None ) json.dumps(datetime.datetime.now(), default=date_handler) '"2010-04-20T20:08:21.634121"' 这是ISO 8601格式。 更全面的默认处理程序功能: def handler(obj): if hasattr(obj, 'isoformat'): return obj.isoformat() elif isinstance(obj, ...): return ... else: raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj)) 更新:添加了类型和值的输出。 更新:还处理日期 回答2
  • 如何在 Python 日志记录中更改时区?(How to Change the time zone in Python logging?)
    问题 我想更改日志文件中的时间戳,使其反映我当前的时区,以便我可以更快地调试错误, 我可以更改日志文件中的时区吗? 目前我的配置是: logging.basicConfig(filename='audit.log', filemode='w', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') 回答1 如何记录时区 %Z来自 strftime 格式 视窗 >>> import logging >>> logging.basicConfig(format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p %Z") >>> logging.error('test') 11/03/2017 02:29:54 PM Mountain Daylight Time test Linux >>> import logging >>> logging.basicConfig(format="%(asctime)s %(message)s", datefmt="%m/%d/%Y %I:%M:%S %p %Z") >>> logging.error('test') 11/03/2017 02:30:50 PM MDT
  • datetime.strptime()的Python时区'%z'指令不可用(Python timezone '%z' directive for datetime.strptime() not available)
    问题 使用datetime.strptime()的'%z'模式 我有一个表示日期的字符串文本,我完全能够解析它并将其转换为干净的datetime对象: date = "[24/Aug/2014:17:57:26" dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S") 除了无法使用此处指定的%z模式捕获带有时区的整个日期字符串 date_tz = 24/Aug/2014:17:57:26 +0200 dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S %z]") >>> ValueError: 'z' is a bad directive in format '[%d/%b/%Y:%H:%M:%S %z]' 因为正如这个错误报告所说 每个平台都实现了strftime() 我精确地说,朴素的tzinfo指令'%Z'没有这样的问题 解决方法:将tzinfo字符串转换为tzinfo对象 通过使用dateutil模块将GST时间格式字符串转换为tzinfo对象[如此处建议] [4],然后将tzinfo插入datetime对象,我可以完美地实现以下解决方法 问题:使%z适用于我的平台? 但是由于显然我将需要%z模式来进行进一步的项目,因此我想找到一种避免这种解决方法的解决方案
  • 如何在python中将时区与datetime对象一起使用?(How do I use timezones with a datetime object in python?)
    问题 如何正确表示时区中的其他时区? 以下示例仅适用于我,因为我知道EDT比我早一小时,因此我可以取消对myTimeZone()减法的评论。 import datetime, re from datetime import tzinfo class myTimeZone(tzinfo): """docstring for myTimeZone""" def utfoffset(self, dt): return timedelta(hours=1) def myDateHandler(aDateString): """u'Sat, 6 Sep 2008 21:16:33 EDT'""" _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)') day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups() month = [ 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' ].index(month.upper()) + 1 dt =
  • 如何在Python中获取“时区感知”的datetime.today()值?(How do I get a value of datetime.today() in Python that is “timezone aware”?)
    问题 我试图从datetime.today()的值中减去一个日期值,以计算多久以前的事情。 但它抱怨: TypeError: can't subtract offset-naive and offset-aware datetimes 值datetime.today()似乎不是“时区感知”的,而我的其他日期值是。 如何获取时区感知的datetime.today()值? 现在,这给了我当地时间,正好是PST,即UTC-8个小时。 最坏的情况是,有没有一种方法可以手动将时区值输入到datetime.today()返回的datetime对象中,并将其设置为UTC-8? 当然,理想的解决方案是让它自动知道时区。 回答1 在标准库中,没有跨平台的方法来创建可感知的时区而不创建自己的时区类。 在Windows上,存在win32timezone.utcnow() ,但这是pywin32的一部分。 我宁愿建议使用pytz库,该库具有大多数时区的不断更新的数据库。 使用本地时区可能非常棘手(请参见下面的“更多阅读”链接),因此您可能希望在整个应用程序中使用UTC,尤其是对于算术运算(例如计算两个时间点之间的时差)。 您可以像这样获取当前日期/时间: import pytz from datetime import datetime datetime.utcnow().replace(tzinfo
  • 仅使用python标准库将python UTC日期时间转换为本地日期时间?(Convert a python UTC datetime to a local datetime using only python standard library?)
    问题 我有一个使用datetime.utcnow()创建并保存在数据库中的python datetime实例。 为了进行显示,我想使用默认的本地时区(即,好像使用datetime.now()创建了datetime)将从数据库中检索到的datetime实例转换为本地datetime。 如何仅使用python标准库(例如,没有pytz依赖项)将UTC日期时间转换为本地日期时间? 似乎一种解决方案是使用datetime.astimezone(tz),但是如何获得默认的本地时区? 回答1 在Python 3.3+中: from datetime import datetime, timezone def utc_to_local(utc_dt): return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None) 在Python 2/3中: import calendar from datetime import datetime, timedelta def utc_to_local(utc_dt): # get integer timestamp to avoid precision lost timestamp = calendar.timegm(utc_dt.timetuple()) local_dt = datetime
  • 在Python中将字符串日期转换为时间戳(Convert string date to timestamp in Python)
    问题 如何将"%d/%m/%Y"格式的字符串转换为时间戳? "01/12/2011" -> 1322697600 回答1 >>> import time >>> import datetime >>> s = "01/12/2011" >>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple()) 1322697600.0 回答2 我使用ciso8601 ,它比datetime的strptime快62倍。 t = "01/12/2011" ts = ciso8601.parse_datetime(t) # to get time in seconds: time.mktime(ts.timetuple()) 您可以在此处了解更多信息。 回答3 要将字符串转换为日期对象: from datetime import date, datetime date_string = "01/12/2011" date_object = date(*map(int, reversed(date_string.split("/")))) assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()
  • Python - 将时间转换为不同的时区,保持 am/pm(Python - Convert time to different time zone, keep am/pm)
    问题 在 Python 中,使用此函数(采用东部标准时间 (EST) 和 am/pm,应以 3 种时间格式输出。中部时间 (CT)、山地时间 (MT) 和太平洋时间 (PT) 都在正确的 am /下午): def time_in_24h(time,time_day): #time is eastern time ''' (number, str)--> number This function converts a 12-hour time, represented by am/pm,to its equivalent 24-hour time. Returns time in the 24-hour format. ''' cCentral = 'Central Time(CT)' #-1 hour offset mMountain = 'Mountain Time(MT)'#-2 hours offset pPacific = 'Pacific Time(PT)'#-3 hours offset eEst = 'EST is' if time_day!='pm' and time_day!='am': print('Input is not in the right format') #this is where input is not in the right format
  • 如何将明天(特定时间)日期转换为时间戳(How to convert tomorrows (at specific time) date to a timestamp)
    问题 我如何才能为接下来的 6 点创建时间戳,无论是今天还是明天? 我尝试使用 datetime.datetime.today() 并用 +1 和小时 = 6 替换日期,但我无法将其转换为时间戳。 需要你的帮助 回答1 要生成明天早上 6 点的时间戳,您可以使用以下内容。 这将创建一个表示当前时间的 datetime 对象,检查当前小时是否 < 6 点钟,为下一个 6 点钟创建一个 datetime 对象(包括在必要时添加增加的日期),最后转换将日期时间对象转换为时间戳 from datetime import datetime, timedelta import time # Get today's datetime dtnow = datetime.now() # Create datetime variable for 6 AM dt6 = None # If today's hour is < 6 AM if dtnow.hour < 6: # Create date object for today's year, month, day at 6 AM dt6 = datetime(dtnow.year, dtnow.month, dtnow.day, 6, 0, 0, 0) # If today is past 6 AM, increment date by 1 day
  • 为什么datetime.datetime.utcnow()不包含时区信息?(Why does datetime.datetime.utcnow() not contain timezone information?)
    问题 datetime.datetime.utcnow() 鉴于此datetime时间明确是UTC datetime时间,为什么没有任何时区信息? 我希望它包含tzinfo 。 回答1 这意味着它是时区幼稚的,因此您不能将其与datetime.astimezone 你可以给它一个时区 import pytz # 3rd party: $ pip install pytz u = datetime.utcnow() u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset 现在您可以更改时区 print(u.astimezone(pytz.timezone("America/New_York"))) 要获取给定时区中的当前时间,可以将tzinfo直接传递给datetime.now() : #!/usr/bin/env python from datetime import datetime import pytz # $ pip install pytz print(datetime.now(pytz.timezone("America/New_York"))) 它适用于任何时区,包括那些遵守夏令时(DST)的时区,即,它适用于在不同时间具有不同utc偏移量(非固定utc偏移量)的时区。
  • 如何在python中识别不知道的日期时间时区(How to make an unaware datetime timezone aware in python)
    问题 我需要做什么 我有一个不带时区的datetime对象,我需要向其添加一个时区,以便能够将其与其他时区可感知的datetime对象进行比较。 对于这种传统情况,我不想将我的整个应用程序转换为时区。 我尝试过的 首先,演示该问题: Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) [GCC 4.2.1 (Apple Inc. build 5646)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import datetime >>> import pytz >>> unaware = datetime.datetime(2011,8,15,8,15,12,0) >>> unaware datetime.datetime(2011, 8, 15, 8, 15, 12) >>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC) >>> aware datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>) >>> aware == unaware Traceback (most recent call
  • Python:如何将日期时间/时间戳从一个时区转换为另一个时区?(Python: How do you convert a datetime/timestamp from one timezone to another timezone?)
    问题 具体来说,给定服务器的时区(系统时间角度)和时区输入,我如何计算系统时间,就像它在那个新时区中一样(无论夏令时如何)? import datetime current_time = datetime.datetime.now() #system time server_timezone = "US/Eastern" new_timezone = "US/Pacific" current_time_in_new_timezone = ??? 回答1 如果您知道原始时区和要将其转换为的新时区,那么结果将非常简单: 为当前时区和新时区都创建一个pytz.timezone对象,例如pytz.timezone("US/Pacific") 。 如果您不知道时区的官方名称,则只需调用pytz.all_timezones即可找到所有官方时区的列表。 使用当前时区的pytz对象(以您的datetime / timestamp作为输入.localize()调用.localize() ,以将其本地化为当前时区。 例如current_timezone.localize(timestamp) 最后,在步骤2的新本地化的datetime / timestamp上调用.astimezone() ,并以所需的新时区的pytz对象作为输入,例如localized_timestamp.astimezone
  • 如何更改java.util.Calendar / Date的时区(How to change TIMEZONE for a java.util.Calendar/Date)
    问题 我想在运行时更改Java Calendar实例中的TIMEZONE值。 我在下面尝试过。 但是两种情况下的输出是相同的: Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); System.out.println(cSchedStartCal.getTime().getTime()); cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); System.out.println(cSchedStartCal.getTime().getTime()); 输出: 1353402486773 1353402486773 我也尝试过,但是输出仍然是相同的: Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); System.out.println(cSchedStartCal.getTime()); Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta")); cSchedStartCal1
  • 在Python中将datetime.date转换为UTC时间戳(Converting datetime.date to UTC timestamp in Python)
    问题 我正在使用Python处理日期,因此需要将其转换为UTC时间戳以在Javascript中使用。 以下代码不起作用: >>> d = datetime.date(2011,01,01) >>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple())) datetime.datetime(2010, 12, 31, 23, 0) 首先将日期对象转换为datetime也无济于事。 我从以下链接尝试了此示例,但是: from pytz import utc, timezone from datetime import datetime from time import mktime input_date = datetime(year=2011, month=1, day=15) 现在要么: mktime(utc.localize(input_date).utctimetuple()) 或者 mktime(timezone('US/Eastern').localize(input_date).utctimetuple()) 确实有效。 如此普遍的问题:如何根据UTC将日期转换为自纪元以来的秒数? 回答1 如果d = date(2011, 1, 1)以UTC表示: >>> from datetime import
  • 如何在Matplotlib中使用时区处理时间?(How to handle times with a time zone in Matplotlib?)
    问题 我的数据点的横坐标是带有时区的datetime.datetime对象(它们的tzinfo恰好是通过MongoDB获得的bson.tz_util.FixedOffset )。 当我用scatter()绘制它们时,刻度标签的时区是什么? 在matplotlibrc中更改timezone不会更改显示的绘图中的任何内容(我一定会误解了Matplotlib文档中有关时区的讨论)。 我对plot()进行了一些实验(而不是scatter() )。 当给定单个日期时,它将对其进行绘制并忽略时区。 但是,给定多个日期时,它使用固定的时区,但是如何确定呢? 我在文档中找不到任何内容。 最后,是plot_date()应该是解决这些时区的问题? 回答1 这个问题已经在评论中得到了回答。 但是我自己仍然在为时区挣扎。 为了清楚起见,我尝试了所有组合。 我认为您有两种主要方法,具体取决于您的datetime对象是否已在所需的时区中或在不同的时区中,我尝试在下面对其进行描述。 我仍然可能错过/混合了一些东西。 时间戳记(日期时间对象):以UTC期望显示:在特定时区 将xaxis_date()设置为所需的显示时区(默认为rcParam['timezone'] ,对我来说这是UTC) 时间戳记(日期时间对象):在特定的时区中所需的显示:在不同的特定时区中 用相应的时区( tzinfo=