ฉันจะรับค่าของ datetime.today () ใน Python ที่เป็น“ เขตเวลาตระหนักถึง” ได้อย่างไร?


310

ฉันพยายามลบค่าวันที่หนึ่งค่าจากการdatetime.today()คำนวณว่านานแค่ไหนแล้ว แต่มันบ่น:

TypeError: can't subtract offset-naive and offset-aware datetimes

datetime.today()ดูเหมือนว่าค่าจะไม่ "ทราบเขตเวลา" ในขณะที่ค่าวันที่อื่นของฉันคือ ฉันจะรับค่าของdatetime.today()เขตเวลาที่ทราบได้อย่างไร

ตอนนี้ฉันให้เวลาตามเวลาท้องถิ่นกับฉันซึ่งเป็น PST เช่นเวลา UTC - 8 ชั่วโมง กรณีที่แย่ที่สุดมีวิธีที่ฉันสามารถป้อนค่าเขตเวลาด้วยตนเองลงในdatetimeวัตถุที่ส่งคืนโดยdatetime.today()และตั้งค่าเป็น UTC-8 ได้หรือไม่

แน่นอนทางออกที่ดีที่สุดคือการให้รู้จักเขตเวลาโดยอัตโนมัติ



10
ดูเหมือนว่าเราสามารถใช้งานได้datetime.now().astimezone()ตั้งแต่ Python 3.6
johnchen902

คำตอบ:


362

ในไลบรารีมาตรฐานไม่มีวิธีข้ามแพลตฟอร์มเพื่อสร้างเขตเวลาที่รับรู้โดยไม่ต้องสร้างคลาสเขตเวลาของคุณเอง

บน Windows มีwin32timezone.utcnow()แต่นั่นเป็นส่วนหนึ่งของ pywin32 ฉันอยากจะแนะนำให้ใช้ไลบรารี pytzซึ่งมีฐานข้อมูลที่ปรับปรุงอย่างต่อเนื่องของเขตเวลาส่วนใหญ่

การทำงานกับเขตเวลาท้องถิ่นอาจยุ่งยากมาก (ดูลิงก์ "อ่านเพิ่มเติม" ด้านล่าง) ดังนั้นคุณอาจต้องการใช้ UTC ตลอดทั้งแอปพลิเคชันของคุณโดยเฉพาะอย่างยิ่งสำหรับการดำเนินการทางคณิตศาสตร์เช่นการคำนวณความแตกต่างระหว่างจุดสองจุด

คุณสามารถรับวันที่ / เวลาปัจจุบันได้เช่น:

import pytz
from datetime import datetime
datetime.utcnow().replace(tzinfo=pytz.utc)

โปรดทราบว่าdatetime.today()และdatetime.now()ส่งคืนเวลาท้องถิ่นไม่ใช่เวลา UTC ดังนั้นการสมัคร.replace(tzinfo=pytz.utc)กับพวกเขาจะไม่ถูกต้อง

อีกวิธีที่ดีที่จะทำคือ:

datetime.now(pytz.utc)

ซึ่งสั้นกว่าเล็กน้อยและทำเช่นเดียวกัน


อ่านเพิ่มเติม / ดูว่าทำไมถึงชอบ UTC ในหลายกรณี:


75
แล้วจะdatetime.now(pytz.utc)เป็นdatetime.utcnow().replace(tzinfo = pytz.utc)อย่างไร
eumiro

5
now(utc)ไม่ส่งคืนวันนี้ (เว้นแต่เป็นเที่ยงคืนใน UTC) จะส่งคืนเวลาปัจจุบันใน UTC คุณต้อง.replace(hour=0, minute=0, ...)เริ่มต้นวันใหม่ด้วย (เช่นdatetime.today())
jfs

1
เอกสารบอกว่าtoday()ผลตอบแทนที่เวลาปัจจุบันไม่เที่ยงคืน หากมีกรณีการใช้งานที่จำเป็นต้องใช้เวลาเที่ยงคืนใช่จำเป็นต้องทำการเปลี่ยนใหม่ เนื่องจากคำถามเดิมเกี่ยวกับความแตกต่างของวันที่และเวลาฉันไม่คิดว่าจำเป็นต้องใช้เวลาเที่ยงคืน
AndiDog

1
@AndiDog: ความคิดเห็นของฉันหมายความว่าฉันคิดว่า (ถูก) ที่เป็นdatetime.today() มีทั้งสองวิธีและวิธีที่ (ตามที่คุณชี้อย่างถูกต้อง) ส่งคืน (เกือบ) ในสิ่งเดียวกัน ไม่มีวิธีการ และวัตถุไม่สามารถใช้แทนกันได้ การใช้วัตถุ datetime แทนวัตถุสามารถสร้างข้อบกพร่องที่ลึกซึ้ง; ผมไม่เห็นเหตุผลใด ๆที่จะอยู่ถ้ามันเป็นที่ซ้ำกันใกล้ combine(date.today(), time())datetime.now().today()date.now()datedatetimedatedatetime.today()datetime.now()
jfs

6
การเพิ่มคำตอบนี้ถ้าคุณเกิดขึ้นจะใช้ Django มักจะใช้timezone.now()แทนdatetime.now()เพราะมันจะใช้เวลา UTC USE_TZ = Trueโดยอัตโนมัติหาก timezoneกำลังค้นหาที่django.utils.timezoneเอกสาร: docs.djangoproject.com/en/1.11/topics/i18n/timezones
Ryan

107

รับเวลาปัจจุบันในเขตเวลาที่กำหนด:

import datetime
import pytz
my_date = datetime.datetime.now(pytz.timezone('US/Pacific'))

2
ดูนี่สิ
Wim

1
คุณไม่ควรใช้เวลาที่มีการแปลยกเว้นสำหรับการส่งออก มีหลายสิ่งที่ผิดพลาดเมื่อใช้วันที่และเวลาตามเขตเวลา: timedelta แบบง่ายไม่คำนึงถึงการปรับเวลาตามฤดูกาลเว้นแต่คุณจะอยู่ในเวลา UTC เพื่อเริ่มต้น ใช้เขตเวลาที่รับรู้ตาม UTC เสมอ แปลงเป็นเขตเวลาท้องถิ่นเมื่อส่งออกเมื่อจำเป็น
MrE

4
ย้ำไม่เห็นด้วยกับ @MrE ที่ฉันได้เปล่งออกมาก่อนหน้านี้ในการแสดงความคิดเห็นเกี่ยวกับคำตอบที่ได้รับการยอมรับ: มีเหตุผลที่ถูกต้องสมบูรณ์ในการทำงานกับ datetimes ภาษาท้องถิ่นและ"คุณไม่ควรใช้เวลาที่มีการแปลยกเว้นสำหรับการส่งออก"เป็นคำแนะนำที่กว้างเกินไป สมมติว่าคุณกำลังเพิ่ม 1 วันในช่วงเวลาหนึ่งสองสามชั่วโมงก่อนเวลาออมแสงกลางวันที่นาฬิกากลับไปหนึ่งชั่วโมง คุณต้องการผลอะไร หากคุณคิดว่าเวลาควรเหมือนกันให้ใช้ชุดข้อมูลที่แปลแล้ว หากคุณคิดว่าควรใช้เวลาหนึ่งชั่วโมงก่อนหน้านี้ให้ใช้ UTC หรือชุดข้อมูลไร้เขตเวลา ซึ่งสมเหตุสมผลแล้วขึ้นอยู่กับโดเมน
Mark Amery

@MarkAmery มากที่สุดเท่าที่ฉันสามารถยอมรับว่าคุณอาจต้องการเพิ่มหรือลบจำนวนวันหรือชั่วโมงและไม่สนใจเกี่ยวกับปัญหาเขตเวลา (เช่นตัวอย่างของคุณ) ความคิดเห็นนี้เกี่ยวข้องกับการผ่านเวลาแก้ไขเขตเวลาให้กับลูกค้า เนื่องจาก Python ใช้เป็นหลักสำหรับกระบวนการแบ็คเอนด์จึงผ่านเวลาไปยังไคลเอนต์ เซิร์ฟเวอร์ควรส่งผ่านวันที่ / เวลาใน UTC เสมอและลูกค้าควรแปลงเป็นวันที่ / เวลา / เขตเวลาท้องถิ่นของตัวเองมิฉะนั้นสิ่งที่ไม่ดีจะเกิดขึ้น: เพียงตรวจสอบผลลัพธ์ของdatetime.datetime(2016, 11, 5, 9, 43, 45, tzinfo=pytz.timezone('US/Pacific'))และดูว่าเป็นสิ่งที่คุณคาดหวังหรือไม่
MrE

"เซิร์ฟเวอร์ควรส่งผ่านวันที่ / เวลาใน UTC เสมอและลูกค้าควรแปลงเป็นวันที่ / เวลา / เขตเวลาท้องถิ่นของตนเอง" - ไม่สิ่งนี้ไม่เป็นความจริงในระดับสากล บางครั้งการใช้เขตเวลาของลูกค้าไม่เหมาะสมและเขตเวลาที่เหมาะสมจะต้องมีการส่งเป็นส่วนหนึ่งของข้อมูล ถ้าในฐานะชาวลอนดอนฉันดูเวลาการประชุมของชมรมหมากรุกซานฟรานซิสโกบนเว็บไซต์ของพวกเขาฉันควรเห็นพวกเขาในเวลาซานฟรานซิสโกไม่ใช่ในเวลาที่ลอนดอน
Mark Amery

69

ใน Python 3 ไลบรารีมาตรฐานทำให้ง่ายต่อการระบุ UTC เป็นเขตเวลา:

>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2016, 8, 26, 14, 34, 34, 74823, tzinfo=datetime.timezone.utc)

หากคุณต้องการแก้ปัญหาที่ใช้เฉพาะห้องสมุดมาตรฐานและผลงานที่ทั้งงูหลาม 2 และ Python 3 ดูคำตอบ jfs'

หากคุณต้องการเขตเวลาท้องถิ่นไม่ใช่ UTC โปรดดูคำตอบของ Mihai Capotă


19

ต่อไปนี้เป็นโซลูชัน stdlib ที่ทำงานได้ทั้ง Python 2 และ 3:

from datetime import datetime

now = datetime.now(utc) # Timezone-aware datetime.utcnow()
today = datetime(now.year, now.month, now.day, tzinfo=utc) # Midnight

โดยที่todayอินสแตนซ์ datetime ที่รับรู้ซึ่งแสดงถึงจุดเริ่มต้นของวัน (เที่ยงคืน) ใน UTC และutcเป็นวัตถุ tzinfo ( ตัวอย่างจากเอกสารประกอบ ):

from datetime import tzinfo, timedelta

ZERO = timedelta(0)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

utc = UTC()

การเปรียบเทียบประสิทธิภาพการทำงานของ: ที่เกี่ยวข้องหลายวิธีที่จะได้รับเที่ยงคืน (เริ่มต้นของวัน) เวลา หมายเหตุ: มันเป็นความซับซ้อนมากขึ้นที่จะได้รับเที่ยงคืนสำหรับโซนเวลาที่มี UTC ไม่คงชดเชย


16

อีกวิธีหนึ่งในการสร้างวัตถุ datetime ที่รับรู้ถึงเขตเวลาซึ่งแสดงเวลาปัจจุบัน:

import datetime
import pytz

pytz.utc.localize( datetime.datetime.utcnow() )  

โปรดทราบว่าpytz.utcและpytz.UTCมีการกำหนดไว้ (และเหมือนกัน)
drevicko

2
คำตอบนี้ดีกว่าคำตอบที่ยอมรับได้เนื่องจากมีความเป็นสากลมากกว่า: replace()เขตเวลาโดยทั่วไปมักเกิดข้อผิดพลาดในการใช้งานอื่น ๆ ส่วนใหญ่ในขณะlocalize()ที่วิธีนี้เป็นวิธีที่นิยมใช้ในการกำหนดเขตเวลาให้กับการประทับเวลาที่ไร้เดียงสา
Antony Hatchkins

@AntonyHatchkins: .localize()วิธีการล้มเหลวสำหรับเวลาท้องถิ่นที่กำกวม คำตอบของ @ philfreo ที่ใช้.now(pytz_timezone)ยังคงทำงานในกรณีดังกล่าว
jfs

ตามที่ระบุไว้ใน python docs .now(pytz_timezone)เหมือนกับlocalize(utcnow)- ก่อนจะสร้างเวลาปัจจุบันใน UTC จากนั้นจะกำหนดเขตเวลา: "<... > ในกรณีนี้ผลลัพธ์จะเท่ากับtz.fromutc(datetime.utcnow().replace(tzinfo=tz))" ทั้งสองคำตอบนั้นถูกต้องและทำงานอยู่เสมอ
Antony Hatchkins

1
เวลาไร้เดียงสา (ไม่ใช่ utc) เท่านั้นที่สามารถทำให้เขตเวลาทราบได้อย่างปลอดภัยแล้วในขณะนี้ : ระบบที่สำคัญควรทราบค่า UTC และpytzผ่าน OLSON db ควรทราบวิธีแปลงเป็นเขตเวลาใด ๆ ในโลก การตระหนักถึงเขตเวลาไร้เดียงสาอื่น ๆ (ไม่ใช่ utc) เป็นเรื่องยากเนื่องจากความกำกวมระหว่างการเลื่อนเวลากลางวัน นั่นไม่ใช่ปัญหาของ.localize(การป้อนis_dstค่าให้มันทำให้ใช้งานได้ทุกวัน) นั่นเป็นปัญหาที่เกิดจากการฝึกฝนในเวลากลางวัน
Antony Hatchkins

16

สายการบินเดียวที่ใช้เฉพาะไลบรารี่มาตรฐานเท่านั้นที่เริ่มทำงานด้วย Python 3.3 คุณสามารถรับdatetimeวัตถุเวลาท้องถิ่นโดยใช้astimezone( ตามที่ johnchen902 แนะนำ ):

from datetime import datetime, timezone

aware_local_now = datetime.now(timezone.utc).astimezone()

print(aware_local_now)
# 2020-03-03 09:51:38.570162+01:00

print(repr(aware_local_now))
# datetime.datetime(2020, 3, 3, 9, 51, 38, 570162, tzinfo=datetime.timezone(datetime.timedelta(0, 3600), 'CET'))

2
เอกสารจะช่วยใหญ่พบที่นี่: docs.python.org/3.8/library/... ฟังก์ชันการทำงานพื้นฐานที่น่าเหลือเชื่อนี้ถูกฝังอยู่ลึกลงไปในย่อหน้าที่คลุมเครือในเอกสารดังนั้นคำตอบสแต็กโอเวอร์โฟลว์นี้เป็นที่เดียวที่มีประสิทธิภาพในอินเทอร์เน็ตทั้งหมดที่มีข้อมูลนี้ ในเอกสารนั้นจะเห็นได้ว่าตั้งแต่ Python 3.6 datetime.now()สามารถเรียกได้โดยไม่มีข้อโต้แย้งใด ๆ และส่งกลับผลลัพธ์ท้องถิ่นที่ถูกต้อง (naive datetimes ถูกสันนิษฐานว่าอยู่ในเขตเวลาท้องถิ่น)
atimholt

8

หากคุณใช้Djangoคุณสามารถตั้งค่าวันที่แบบไม่ทราบ (เฉพาะUTC )

แสดงความคิดเห็นบรรทัดต่อไปนี้ใน settings.py:

USE_TZ = True

8
คุณเห็น django ที่กล่าวถึงในคำถามนี้ที่ไหน
vonPetrushev

1
วิญญาณที่ใจดีบางคนลบคำขอโทษก่อนหน้านี้ของฉันที่นี่ดังนั้นอีกครั้ง: อัปยศกับฉันคำตอบที่ผิดเพราะคำถามไม่ใช่ Django เฉพาะ ฉันทิ้งไว้เพราะอาจช่วยผู้ใช้บางคนได้ แต่ฉันจะลบเมื่อคะแนนเข้าใกล้ 0 ถ้าคำตอบนี้ไม่เหมาะสมให้ลงคะแนน
laffuste

6

pytzเป็นไลบรารี Python ที่ช่วยให้การคำนวณเขตเวลาที่แม่นยำและข้ามแพลตฟอร์มโดยใช้ Python 2.3 หรือสูงกว่า

ด้วย stdlib นี้เป็นไปไม่ได้

ดูคำถามที่คล้ายกันในSO


6

นี่เป็นวิธีหนึ่งในการสร้างด้วย stdlib:

import time
from datetime import datetime

FORMAT='%Y-%m-%dT%H:%M:%S%z'
date=datetime.strptime(time.strftime(FORMAT, time.localtime()),FORMAT)

วันที่จะเก็บวันท้องถิ่นและชดเชยจาก UTCไม่ใช่วันที่ UTC เขตเวลาเพื่อให้คุณสามารถใช้วิธีนี้ถ้าคุณจำเป็นต้องแจ้งที่เขตวันที่จะถูกสร้างขึ้นที่ ในตัวอย่างนี้และในเขตเวลาท้องถิ่นของฉัน:

date
datetime.datetime(2017, 8, 1, 12, 15, 44, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))

date.tzname()
'UTC+02:00'

กุญแจสำคัญคือการเพิ่ม%zคำสั่งเพื่อเป็นตัวแทนรูปแบบเพื่อระบุ UTC ชดเชยของโครงสร้างเวลาที่สร้างขึ้น สามารถดูรูปแบบการแทนอื่น ๆ ได้ในเอกสารโมดูล datetime

หากคุณต้องการวันที่ในเขตเวลา UTC คุณสามารถแทนที่ได้ time.localtime ()ด้วยtime.gmtime ()

date=datetime.strptime(time.strftime(FORMAT, time.gmtime()),FORMAT)

date    
datetime.datetime(2017, 8, 1, 10, 23, 51, tzinfo=datetime.timezone.utc)

date.tzname()
'UTC'

แก้ไข

ใช้งานได้กับ python3เท่านั้น คำสั่ง z ไม่สามารถใช้ได้กับรหัส python 2 _strptime.py


ValueError: 'z' เป็นคำสั่งที่ไม่เหมาะสมในรูปแบบ '% Y-% m-% dT% H:% M:% S% z'
jno

คุณอยู่ในหลาม 2 ใช่ไหม? น่าเสียดายที่ดูเหมือนว่าคำสั่ง z จะไม่สามารถใช้งานได้ใน python 2 โค้ด
_strptime.py

6

ใช้ dateutil ตามที่อธิบายไว้ในPython datetime.datetime.now () ที่ทราบเขตเวลา :

from dateutil.tz import tzlocal
# Get the current date/time with the timezone.
now = datetime.datetime.now(tzlocal())

1
ดูคำตอบของเจเอฟเจบาสเตียนคำตอบสำหรับสถานการณ์ที่สิ่งนี้ให้ผลลัพธ์ที่ไม่ถูกต้อง
Antony Hatchkins

2
ฉันคิดว่าข้อผิดพลาดในโพสต์อื่นเกี่ยวข้องเฉพาะในกรณีการใช้งานเฉพาะ tzlocal()ฟังก์ชั่นยังคงเป็นหนึ่งในโซลูชั่นที่ง่ายที่สุดและแน่นอนควรจะได้รับการกล่าวถึงที่นี่
user8162

2

การรับวันที่ทราบutcเขตเวลาในเขตเวลานั้นเพียงพอสำหรับการลบวันที่ให้ทำงาน

แต่ถ้าคุณต้องการทราบวันที่ในเขตเวลาในเขตเวลาปัจจุบันของคุณคุณtzlocalสามารถไปที่:

from tzlocal import get_localzone  # pip install tzlocal
from datetime import datetime
datetime.now(get_localzone())

PS dateutilมีฟังก์ชั่นที่คล้ายกัน ( dateutil.tz.tzlocal) แต่การแบ่งปันชื่อนั้นมีรหัสฐานที่แตกต่างไปจากเดิมอย่างสิ้นเชิงซึ่งJF Sebastian ระบุไว้อาจให้ผลที่ผิด


งูใหญ่มักจะใช้บนเซิร์ฟเวอร์ โซนเวลาท้องถิ่นบนเซิร์ฟเวอร์มักไม่มีจุดหมายและควรตั้งค่าเป็น UTC เสมอ การตั้งค่า datetime tzinfo ด้วยวิธีนี้จะล้มเหลวในบางกรณี ควรใช้ UTC ให้ดีขึ้นจากนั้นปรับเป็นโซนเวลาที่ต้องการบนเอาต์พุตเท่านั้น ตัวอย่างการคำนวณ timedelta ใด ๆ ไม่ได้พิจารณาการประหยัดเวลากลางวันดังนั้นสิ่งเหล่านี้ควรทำใน UTC จากนั้นแปลเป็นภาษาท้องถิ่น
MrE

@MrE ผิดผิดพลาดตัวอย่าง?
Antony Hatchkins

ลองใช้วัตถุวันที่และเวลาที่แปลในเขตเวลาที่สังเกตการบันทึกเวลากลางวันเพิ่มจำนวนวันเพื่อเปลี่ยนสถานะการบันทึกเวลากลางวันและคุณจะเห็นว่าการทำงานกับวัตถุวันที่และเวลาในเขตเวลาที่แปลเป็นภาษาท้องถิ่นล้มเหลว ดังนั้นความคิดเห็นของฉันที่คุณควรทำดาต้าไทม์ใด ๆ ในเวลา UTC
MrE

จุดที่เป็นอยู่: อย่าทำสิ่งนี้ดำเนินการของคุณใน UTC จากนั้นใช้ datetime.astimezone (เขตเวลา) เพื่อแปลงเป็นโซนเวลาท้องถิ่นบนเอาต์พุต
MrE

2

นี่คือวิธีการแก้ปัญหาโดยใช้เขตเวลาที่สามารถอ่านได้และทำงานได้กับวันนี้ ():

from pytz import timezone

datetime.now(timezone('Europe/Berlin'))
datetime.now(timezone('Europe/Berlin')).today()

คุณสามารถแสดงเขตเวลาทั้งหมดดังนี้:

import pytz

pytz.all_timezones
pytz.common_timezones # or

1

โดยเฉพาะอย่างยิ่งสำหรับเขตเวลาที่ไม่ใช่ UTC:

เขตเวลาเดียวที่มีวิธีการของตัวเองtimezone.utcแต่คุณสามารถเหลวไหลเขตเวลา UTC กับใด ๆ ชดเชยหากคุณต้องการโดยใช้timedelta& และบังคับให้มันใช้timezone.replace

In [1]: from datetime import datetime, timezone, timedelta

In [2]: def force_timezone(dt, utc_offset=0):
   ...:     return dt.replace(tzinfo=timezone(timedelta(hours=utc_offset)))
   ...:

In [3]: dt = datetime(2011,8,15,8,15,12,0)

In [4]: str(dt)
Out[4]: '2011-08-15 08:15:12'

In [5]: str(force_timezone(dt, -8))
Out[5]: '2011-08-15 08:15:12-08:00'

การใช้timezone(timedelta(hours=n))เป็นเขตเวลาเป็นสัญลักษณ์เงินจริงที่นี่และมีแอปพลิเคชั่นที่มีประโยชน์มากมาย


0

หากคุณได้รับเวลาและวันที่ปัจจุบันใน python ให้นำเข้าวันที่และเวลาแพคเกจ pytz ใน python หลังจากคุณจะได้รับวันที่และเวลาปัจจุบันเช่น ..

from datetime import datetime
import pytz
import time
str(datetime.strftime(datetime.now(pytz.utc),"%Y-%m-%d %H:%M:%S%t"))

0

อีกทางเลือกหนึ่งในใจของฉันหนึ่งที่ดีกว่าจะใช้แทนPendulum pytzพิจารณารหัสง่าย ๆ ดังต่อไปนี้:

>>> import pendulum

>>> dt = pendulum.now().to_iso8601_string()
>>> print (dt)
2018-03-27T13:59:49+03:00
>>>

การติดตั้งลูกตุ้มและดูเอกสารของพวกเขาไปที่นี่ มีตัวเลือกมากมาย (เช่น ISO8601 แบบง่าย, RFC3339 และการสนับสนุนรูปแบบอื่น ๆ ) ประสิทธิภาพที่ดีขึ้นและมีแนวโน้มที่จะให้โค้ดที่ง่ายขึ้น


ไม่แน่ใจว่าทำไมการลงคะแนนที่นี่รหัสนี้ทำงานในหลายโปรแกรมที่ทำงาน 7/24 ให้ฉัน :) ไม่ใช่ที่ฉันคิดความคิดเห็นอื่น ๆ แต่โปรดบอกว่าทำไมมันไม่ทำงานสำหรับคุณเพื่อให้ฉันตรวจสอบ ขอบคุณล่วงหน้า
ng10

0

ใช้เขตเวลาตามที่แสดงด้านล่างสำหรับเวลาที่ทราบถึงเขตเวลา ค่าเริ่มต้นคือ UTC:

from django.utils import timezone
today = timezone.now()

0

Tyler จาก 'howchoo' สร้างบทความที่ยอดเยี่ยมจริงๆที่ช่วยให้ฉันได้รับแนวคิดที่ดีขึ้นเกี่ยวกับวัตถุของเวลาและการเชื่อมโยงด้านล่าง

ทำงานกับ Datetime

โดยพื้นฐานแล้วฉันเพิ่งเพิ่มสิ่งต่อไปนี้ไปยังจุดสิ้นสุดของวัตถุทั้งวันของฉัน

.replace(tzinfo=pytz.utc)

ตัวอย่าง:

import pytz
import datetime from datetime

date = datetime.now().replace(tzinfo=pytz.utc)

0

ลองpnp_datetimeตลอดเวลาที่ใช้ไปและกลับมาอยู่กับเขตเวลาและจะไม่ทำให้เกิดปัญหา offset-naive และ offset-aware

>>> from pnp_datetime.pnp_datetime import Pnp_Datetime
>>>
>>> Pnp_Datetime.utcnow()
datetime.datetime(2020, 6, 5, 12, 26, 18, 958779, tzinfo=<UTC>)

0

ควรเน้นว่าตั้งแต่ Python 3.6 คุณเพียงต้องการ lib มาตรฐานเพื่อรับวัตถุ datetime ทราบเขตเวลาที่แสดงเวลาท้องถิ่น (การตั้งค่าระบบปฏิบัติการของคุณ) ใช้astimezone ()

import datetime

datetime.datetime(2010, 12, 25, 10, 59).astimezone()
# e.g.
# datetime.datetime(2010, 12, 25, 10, 59, tzinfo=datetime.timezone(datetime.timedelta(seconds=3600), 'Mitteleuropäische Zeit'))

datetime.datetime(2010, 12, 25, 12, 59).astimezone().isoformat()
# e.g.
# '2010-12-25T12:59:00+01:00'

# I'm on CET/CEST

(ดูความคิดเห็นของ @ johnchen902)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.