2010-08-04 45 views
2

我想要做的是从日期中减去7小时。我搜索了堆栈溢出并找到了关于如何去做的答案here。然后我就去阅读timedelta的文档,因为我无法理解在接受的答案是行不,这里改写为便于:如何计算timedelta python

from datetime import datetime 

dt = datetime.strptime(date, '%Y-%m-%d %H:%M') 
dt_plus_25 = dt + datetime.timedelta(0, 2*60*60 + 30*60) 

不幸的是,即使是阅读文档后,我还是不明白如何该线路起作用。

什么是timedelta行?它是如何工作的?

此外,在我发现这个stackoverflow后,我正在使用time.struct_time元组。我有一个变量TM:

tm = time.strptime(...) 

我只是通过tm.tm_hour访问小时,减去七次取,但这种显而易见的原因,不能正常工作。这就是为什么我现在试图使用日期时间。现在有价值

tm = datetime.strptime(...) 

我假设使用日期时间是减去七小时的最佳途径?

注意:因为我想从UTC到美国/太平洋时区,因此减去7小时。有没有内置的方法来做到这一点?

回答

2

What is the timedelta line doing? How does it work?

它创建一个timedelta对象。

“时间”有两种含义。

  • “时间点”(即,日期或日期时间)

  • “持续时间” 或间隔或 “时间增量”

甲时间增量为间隔,持续时间,一段时间。你提供了3个值。

  • 0天。

  • 2 * 60 * 60 + 30 * 60秒。

+0

当我使用datetime.timedelta(...),我得到一个错误:AttributeError:类型对象'datetime.datetime'没有属性'timedelta'。这是为什么发生?我从日期时间导入日期时间 – laleto 2010-08-04 22:57:56

+0

@laleto导入使用。这是一个不同的问题。用**真**代码和**真**错误更新你的问题,你真的**得到。 – 2010-08-04 22:59:10

+0

那么你回答了我的原始问题,并在此后产生。我通过从datetime导入timedelta中添加另一个导入语句来解决此问题。 – laleto 2010-08-04 23:02:38

1

timedelta()生成一个表示时间量的对象 - 希腊字母delta用于数学表示“差异”。因此,要计算一段时间的加法或减法,您需要开始时间并添加所需的更改或增量。

您引用的具体调用是用于生成2.5小时的timedelta。第一个参数是天,第二个是秒,所以你有(0天,2.5小时),2.5小时(秒)是(2小时* 60分钟/小时* 60秒/分钟)+(30分钟* 60秒/分钟)。

对于你的情况,你必须为0天,7小时的负时间差,所以你会写:

timedelta(0, -7 * 60 * 60) 

...或timedelta(0,-7 * 3600)或任何品牌它清楚你在做什么。

1

Note: subtracting seven hours because I want to go from UTC to US/Pacific timezone. Is there a built-in way to do this?

是的,有:datetime有内置的时区转换功能。如果使用这样的事情让你datetime对象:

tm = datetime.strptime(date_string, '%Y-%m-%d %H:%M') 

它不会有什么特别的时区,在第一个“附加”到它,但你可以给它使用

tm_utc = tm.replace(tzinfo=pytz.UTC) 

一个时区。然后你可以将它转换为美国/太平洋地区,我会建议这样做,而不是手动减去7小时,因为它明确指出你要保留实际的时间同样的,只是把它转换到不同的时区,而如果你手动减去七个小时,看起来更像是你实际上试图让过去七个小时。此外,时区转换正确处理夏时制等古怪事情。

为此,您需要安装pytz软件包,该软件包未包含在Python标准库中。