2.10.1 生成时间对象

华为是一家伟大的中国公司,请问,华为是什么时候成立的?

用一个字符串来告诉你答案:09151987,从这个字符串可以比较容易地推断出,1987是年份,15肯定不是月份,而是日期,那么09就是月份了。所以,我们可以推断出华为成立于1987年9月15日。

Google是一家伟大的美国公司,请问,Google是什么时候成立的?

也用一个字符串来告诉你答案:04/09/1998,从这个字符串可以推断出1998是年份,但是我们无法推定月份是4还是9。

通过Python,我们可以用指定的值来创建datetime对象,这通常有两种情况。

第一种情况,是我们明确地知道日期的每个组成部分独立的值,我们用以下方式来指定。


>>> birthday = datetime(year=2013, month=2, day=28)
>>> birthday
datetime.datetime(2013, 2, 28, 0, 0)

另外一种情况更复杂一点,但是在实际编程中应用更广泛,是根据字符串来生成日期对象。这种情况更复杂是因为人类对日期书写的格式太随意了,书写的顺序可能是年月日,可能是月日年,还可能是日月年,其中的分隔符就更多样了,比如:19990603、06.03.1999、3|6|1999、1999_06_03、99-06-03、1999/06/03、1999 06 03。

这种书写格式的不统一,给程序员带来了额外的工作量。作为程序员,我们没法规定车须同轨、书须同文,能做的是给出自己的要求,例如指定日期字符串的同时必须指定相应的格式:


created_at = datetime.strptime('2019-04-25', '%Y-%m-%d')

%Y-%m-%d表示年月日,中间都用“-”来分隔,第一个部分是年,第二个部分是月,第三个部分是日。有了这样的格式信息,我们就能正确解析字符串中的信息,创建出正确的datetime对象。例子中用到的%Y、%m、%d被称为标识符,更多的标识符如表2-9所示。

表2-9 日期时间信息的标识符

来看以下两段代码实例,它们指定了不同风格的日期字符串,同时也指定了相应的格式,从而保证了日期字符串能够被正确地解析。


>>> date1 = datetime.strptime('06_25_2019', '%m_%d_%Y')
>>> date1
datetime.datetime(2019, 6, 25, 0, 0)

>>> date2 = datetime.strptime('1949/10/01', '%Y/%m/%d')
>>> date2
datetime.datetime(1949, 10, 1, 0, 0)