بايثون-تعيين تاريخ ووقت في منطقة زمنية محددة (بدون تحويلات التوقيت العالمي المنسق)

StackOverflow https://stackoverflow.com/questions/4974712

  •  12-11-2019
  •  | 
  •  

سؤال

فقط أن تكون واضحة ، وهذا هو بيثون 2.6 ، وأنا باستخدام بيتز.

هذا لتطبيق يتعامل فقط مع المناطق الزمنية الأمريكية ، أحتاج إلى أن أكون قادرا على تثبيت تاريخ (اليوم) ، والحصول على طابع زمني يونكس (وقت العصر) لمدة 8 مساء و 11 مساء في توقيت المحيط الهادي فقط.

هذا يقودني للجنون.

> pacific = pytz.timezone("US/Pacific")

> datetime(2011,2,11,20,0,0,0,pacific)

datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)

> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'

zsh> date -d '@1297454400'    
Fri Feb 11 12:00:00 PST 2011

لذلك ، على الرغم من أنني أقوم بإعداد منطقة زمنية ، وإنشاء التاريخ والوقت مع تلك المنطقة الزمنية ، فإنه لا يزال خلق ذلك كما أوتك ومن ثم تحويله.هذا هو أكثر من مشكلة منذ أوتك سيكون قبل يوم عندما أحاول أن تفعل الحسابات.

هل هناك وسيلة سهلة (أو على الأقل الحسية) طريقة لتوليد الطابع الزمني لل8 مساء توقيت المحيط الهادي اليوم?

(أن تكون واضحة ، وأنا أفهم قيمة استخدام أوتك في معظم الحالات ، مثل الطوابع الزمنية قاعدة البيانات ، أو للتخزين العام.هذه ليست واحدة من تلك الحالات ، وأنا على وجه التحديد بحاجة إلى الطابع الزمني للمساء في توقيت المحيط الهادي ، والتوقيت العالمي المنسق لا ينبغي أن يكون للدخول في ذلك.)

هل كانت مفيدة؟

المحلول

إنشاء كائن تسينفو utc للمنطقة الزمنية أوتك ، ثم حاول هذا:

#XXX: WRONG (for any timezone with a non-fixed utc offset), DON'T DO IT
datetime(2011,2,11,20,0,0,0,pacific).astimezone(utc).strftime("%s")

تحرير: كما هو موضح في التعليقات ، وضع المنطقة الزمنية في datetime منشئ ليست دائما قوية.الطريقة المفضلة باستخدام وثائق بيتز سيكون:

pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")

لاحظ أيضا من التعليقات التي strftime("%s") لا يمكن الاعتماد عليها ، فإنه يتجاهل معلومات المنطقة الزمنية (حتى أوتك) ويفترض المنطقة الزمنية للنظام انها تعمل على.وهو يعتمد على تنفيذ مكتبة ج الأساسية ولا يعمل على الإطلاق على بعض الأنظمة (على سبيل المثال.ويندوز).

نصائح أخرى

هناك مشكلتان على الأقل:

  1. يجب أن لا تمر منطقة زمنية مع أوتك أوفست غير ثابتة مثل "US/Pacific" كمعلمة تزينفو مباشرة.يجب عليك استخدام pytz.timezone("US/Pacific").localize() الطريقة بدلا من ذلك
  2. .strftime('%s') ليست محمولة, يتجاهل تسينفو, ، ويستخدم دائما المنطقة الزمنية المحلية.استخدام datetime.timestamp() أو نظائرها على إصدارات بايثون القديمة بدلا من ذلك.

لجعل التاريخ والوقت علم المنطقة الزمنية في منطقة زمنية معينة:

#!/usr/bin/env python
from datetime import datetime 
import pytz # $ pip install pytz

tz = pytz.timezone("US/Pacific")
aware = tz.localize(datetime(2011, 2, 11, 20), is_dst=None)

للحصول على بوسيكس الطابع الزمني:

timestamp = (aware - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()

(على بيثون 2.6, انظر totimestamp() وظيفة على كيفية محاكاة .total_seconds() الطريقة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top