1

Python cung cấp cho nhà phát triển một số công cụ để làm việc với ngày và thời gian. Trong bài viết này, chúng tôi sẽ xem xét datetime và  time các mô-đun. Chúng tôi sẽ nghiên cứu cách họ làm việc và một số sử dụng phổ biến cho họ. Hãy bắt đầu với datetime mô-đun!

Mô-đun thời gian

Chúng ta sẽ học về các lớp sau từ datetime mô-đun:

  • datetime.data
  • datetime.timedelta 
  • datetime.datetime

Chúng sẽ bao gồm phần lớn các trường hợp bạn sẽ cần sử dụng date và datetime phản đối trong Python. Ngoài ra còn có một tzinfo lớp để làm việc với các múi giờ mà chúng tôi sẽ không bao gồm. Vui lòng xem tài liệu Python để biết thêm thông tin về lớp đó.

datetime.date

Python có thể đại diện cho ngày một số cách khác nhau. Trước tiên chúng ta sẽ xem xét  datetime.date định dạng vì nó là một trong những đối tượng ngày đơn giản hơn.

>>> datetime.date(2012, 13, 14)
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.ValueError: month must be in 1..12
>>> datetime.date(2012, 12, 14)
datetime.date(2012, 12, 14)

Mã này cho thấy làm thế nào để tạo một date đối tượng đơn giản . Lớp ngày chấp nhận ba đối số: năm, tháng và ngày. Nếu bạn vượt qua nó một giá trị không hợp lệ, bạn sẽ thấy một ValueError, giống như ở trên. Nếu không, bạn sẽ thấy một datetime.date đối tượng được trả lại. Hãy xem một ví dụ khác:

>>> import datetime
>>> d = datetime.date(2012, 12, 14)
>>> d.year
2012
>>> d.day
14
>>> d.month
12

Ở đây chúng ta gán đối tượng ngày cho biến  d. Bây giờ chúng ta có thể truy cập các thành phần ngày khác nhau theo tên, chẳng hạn như d.year hoặc  d.month . Bây giờ hãy tìm hiểu ngày hôm nay là ngày nào:

>>> datetime.date.today()
datetime.date(2014, 3, 5)

Điều này có thể hữu ích bất cứ khi nào bạn cần ghi lại ngày hôm nay. Hoặc có lẽ bạn cần thực hiện một phép tính dựa trên ngày dựa trên ngày hôm nay. Đó là một phương pháp tiện lợi nhỏ mặc dù.

datetime.datetime

Một datetime.datetime đối tượng chứa tất cả thông tin từ datetime.date một datetime.time đối tượng cộng . Hãy tạo một vài ví dụ để chúng ta có thể hiểu rõ hơn về sự khác biệt giữa đối tượng này và datetime.date đối tượng.

>>> datetime.datetime(2014, 3, 5)
datetime.datetime(2014, 3, 5, 0, 0)
>>> datetime.datetime(2014, 3, 5, 12, 30, 10)
datetime.datetime(2014, 3, 5, 12, 30, 10)
>>> d = datetime.datetime(2014, 3, 5, 12, 30, 10)
>>> d.year
2014
>>> d.second
10
>>> d.hour
12

Ở đây chúng ta có thể thấy rằng datetime.datetime chấp nhận một số đối số bổ sung: năm, tháng, ngày, giờ, phút và giây. Nó cũng cho phép bạn chỉ định thông tin micro giây và múi giờ. Khi bạn làm việc với cơ sở dữ liệu, bạn sẽ thấy mình sử dụng các loại đối tượng này rất nhiều. Hầu hết thời gian, bạn sẽ cần phải chuyển đổi từ ngày hoặc datetime định dạng Python sang SQL datetime hoặc timestamp định dạng. Bạn có thể tìm hiểu những gì ngày nay bằng datetime.datetime cách sử dụng hai phương pháp khác nhau:

>>> datetime.datetime.today()
datetime.datetime(2014, 3, 5, 17, 56, 10, 737000)
>>> datetime.datetime.now()
datetime.datetime(2014, 3, 5, 17, 56, 15, 418000)

Các datetime mô-đun có một phương pháp khác mà bạn nên biết được gọi strftime. Phương pháp này cho phép nhà phát triển tạo ra một chuỗi đại diện cho thời gian ở định dạng dễ đọc hơn. Có toàn bộ bảng tùy chọn định dạng mà bạn nên đọc trong tài liệu Python, phần 8.1.7. Chúng ta sẽ xem xét một vài ví dụ để cho bạn thấy sức mạnh của phương pháp này:

>>> datetime.datetime.today().strftime("%Y%m%d")
'20140305'
>>> today = datetime.datetime.today()
>>> today.strftime("%m/%d/%Y")
'03/05/2014'
>>> today.strftime("%Y-%m-%d-%H.%M.%S")
'2014-03-05-17.59.53'

Ví dụ đầu tiên là một loại hack. Nó chỉ ra cách chuyển đổi datetime đối tượng ngày nay thành một chuỗi theo định dạng YYYYMMDD (năm, tháng, ngày). Ví dụ thứ hai là tốt hơn. Ở đây chúng ta gán datetime đối tượng ngày nay cho một biến được gọi today và sau đó thử hai hoạt động định dạng chuỗi khác nhau. Cái đầu tiên thêm dấu gạch chéo về phía trước giữa các datetime phần tử và cũng sắp xếp lại nó để nó trở thành tháng, ngày, năm . Ví dụ cuối cùng tạo ra dấu thời gian của các loại theo định dạng khá điển hình: YYYY-MM-DD.HH.MM.SS . Nếu bạn muốn đi đến một năm có hai chữ số, bạn có thể trao đổi %Y cho  %y .

datetime.timedelta

Đối datetime.timedelta tượng đại diện cho một khoảng thời gian. Nói cách khác, đó là sự khác biệt giữa hai ngày hoặc thời gian. Hãy xem một ví dụ đơn giản:

>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2014, 3, 5, 18, 13, 51, 230000)
>>> then = datetime.datetime(2014, 2, 26)
>>> delta = now - then
>>> type(delta)
<type 'datetime.timedelta'>
>>> delta.days
7
>>> delta.seconds
65631

Chúng tôi tạo ra hai datetime đối tượng ở đây. Một cho ngày hôm nay và một cho một tuần trước. Sau đó, chúng tôi có sự khác biệt giữa chúng. Điều này trả về một timedelta đối tượng mà sau đó chúng ta có thể sử dụng để tìm ra số ngày hoặc giây giữa hai ngày. Nếu bạn cần biết số giờ hoặc phút giữa hai người, bạn sẽ phải sử dụng một số phép toán để tìm ra nó. Đây là một cách để làm điều đó:

>>> seconds = delta.total_seconds()
>>> hours = seconds // 3600
>>> hours
186.0
>>> minutes = (seconds % 3600) // 60
>>> minutes
13.0

Điều này cho chúng ta biết là có 186 giờ và 13 phút trong một tuần. Lưu ý rằng chúng tôi đang sử dụng dấu gạch chéo kép làm toán tử chia. Điều này được gọi là phân chia sàn.

Bây giờ chúng tôi đã sẵn sàng để tiếp tục và tìm hiểu một chút về time mô-đun!

Mô-đun thời gian

Các time mô-đun cung cấp khả năng tiếp cận phát triển Python để nhiều chức năng thời gian liên quan. Mô-đun thời gian dựa trên cái mà nó gọi là kỷ nguyên, thời điểm bắt đầu. Đối với các hệ thống Unix, epoch là vào năm 1970. Để tìm hiểu xem epoch trên hệ thống của bạn là gì, hãy thử chạy như sau:

>>> import time
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, 
                 tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

Tôi đã chạy nó trên Windows 7 và dường như cũng nghĩ rằng thời gian bắt đầu vào năm 1970. Dù sao, trong phần này, chúng ta sẽ nghiên cứu các chức năng liên quan đến thời gian sau:

  • time.ctime 
  • time.sleep 
  • time.strftime 
  • time.time 

Băt đâu nao!

thời gian

Các time.ctime chức năng sẽ chuyển đổi một thời gian trong vài giây kể từ khi kỷ nguyên thành một chuỗi đại diện theo giờ địa phương. Nếu bạn không vượt qua bất cứ điều gì, thì thời gian hiện tại được trả lại. Hãy thử một vài ví dụ:

>>> import time
>>> time.ctime()
'Thu Mar 06 07:28:48 2014'
>>> time.ctime(1384112639)
'Sun Nov 10 13:43:59 2013'

Ở đây, chúng tôi hiển thị kết quả của cuộc gọi ctime mà không có gì cả và với số giây khá ngẫu nhiên kể từ kỷ nguyên. Tôi đã thấy một thứ được sử dụng khi ai đó lưu lại ngày tháng dưới dạng giây kể từ thời đại và sau đó họ muốn chuyển đổi nó thành thứ mà con người có thể hiểu được. Việc đơn giản hơn là lưu một số nguyên lớn (hoặc dài) vào cơ sở dữ liệu sau đó để xử lý định dạng từ một  datetime đối tượng thành bất kỳ đối tượng ngày nào mà cơ sở dữ liệu chấp nhận. Tất nhiên, điều đó cũng có nhược điểm là bạn cần phải chuyển đổi giá trị nguyên hoặc giá trị float thành chuỗi.

thời gian ngủ

Các time.sleep chức năng cung cấp cho các nhà phát triển khả năng đình chỉ thực hiện kịch bản của bạn một số lượng nhất định của giây. Nó giống như thêm tạm dừng vào chương trình của bạn. Tôi đã thấy điều này hữu ích khi tôi cần đợi một giây để tệp hoàn tất đóng hoặc cơ sở dữ liệu cam kết hoàn thành cam kết. Hãy xem một ví dụ. Mở một cửa sổ mới trong IDLE và lưu mã sau đây:

import time

for x in range(5):
    time.sleep(2)
    print("Slept for 2 seconds")

Bây giờ chạy mã trong IDLE. Bạn có thể làm điều đó bằng cách vào menu Run và sau đó chọn mục menu Run module . Khi bạn làm như vậy, bạn sẽ thấy nó in ra cụm từ * Ngủ trong 2 giây * năm lần với một khoảng dừng hai giây giữa mỗi lần in. Nó thực sự dễ sử dụng!

thời gian

Các   time mô-đun có strftime chức năng làm việc ở khá nhiều cách thức giống như các  datetime phiên bản. Sự khác biệt chủ yếu ở những gì nó chấp nhận cho đầu vào: một tuple hoặc một  struct_time đối tượng, giống như những thứ được trả về khi bạn gọi time.gmtime() hoặc time.localtime(). Đây là một ví dụ nhỏ:

>>> time.strftime("%Y-%m-%d-%H.%M.%S",
                  time.localtime())
'2014-03-06-20.35.56'

Mã này khá giống với mã dấu thời gian mà chúng ta đã tạo trong datetime phần của chương này. Tôi nghĩ rằng datetime phương thức này trực quan hơn một chút ở chỗ bạn chỉ cần tạo một  datetime.datatime đối tượng và sau đó gọi strftime phương thức của nó với định dạng bạn muốn. Với mô-đun thời gian, bạn phải vượt qua định dạng cộng với một tuple thời gian. Điều đó thực sự tùy thuộc vào bạn để quyết định xem cái nào có ý nghĩa nhất đối với bạn.

thời gian

Các time.time chức năng sẽ trở lại với thời gian trong vài giây kể từ khi kỷ nguyên như một số dấu chấm động. Hãy xem:

>>> time.time()
1394199262.318

Điều đó khá đơn giản. Bạn có thể sử dụng điều này khi bạn muốn lưu thời gian hiện tại vào cơ sở dữ liệu nhưng bạn không muốn chuyển đổi nó sang datetime phương thức của cơ sở dữ liệu  . Bạn cũng có thể nhớ lại rằng ctime phương thức chấp nhận thời gian tính bằng giây, vì vậy chúng tôi có thể sử dụng time.time để lấy số giây truyền qua ctime, như thế này:

>>> time.ctime(time.time())
'Fri Mar 07 07:36:38 2014'

Nếu bạn thực hiện một số thao tác đào trong tài liệu cho mô-đun thời gian hoặc nếu bạn chỉ thử nghiệm với nó một chút, bạn có thể sẽ tìm thấy một vài cách sử dụng khác cho chức năng này.

Kết thúc

Tại thời điểm này, bạn nên biết cách làm việc với ngày và thời gian bằng cách sử dụng các mô-đun chuẩn của Python. Python cung cấp cho bạn rất nhiều sức mạnh khi làm việc với ngày. Bạn sẽ thấy các mô-đun này hữu ích nếu bạn cần tạo một ứng dụng theo dõi các cuộc hẹn hoặc cần chạy vào những ngày cụ thể. Chúng cũng hữu ích khi làm việc với cơ sở dữ liệu.

|