00. 00 Trong bài học này, tôi sẽ nói với bạn về biểu diễn chuỗi thời gian trong Python. Đây là phần cuối của chuỗi liên tục mà tôi đã nói về biểu diễn đối tượng thời gian Python
00. 12 Chuỗi là thứ dễ đọc nhất đối với con người, nhưng chúng lại khó vận hành nhất đối với máy móc. Khi bạn tạo một biểu diễn chuỗi tốt, điều quan trọng là bạn cần bao gồm tất cả thông tin mà người dùng cần để tương tác với ứng dụng của bạn, nhưng chỉ những thông tin thực sự cần thiết
00. 29 Đó sẽ là trọng tâm của bài học này
00. 33 Có ba hàm hữu ích mà tôi muốn chỉ cho bạn để chuyển đổi chuỗi thời gian. Đầu tiên là time.asctime
, chỉ đơn giản là nhận một đối tượng bộ thời gian hoặc struct_time
tùy chọn và chỉ trả về dấu thời gian, đây là một loại chuỗi được định dạng cơ bản cho thời gian
00. 51 strftime[]
[“thời gian định dạng chuỗi'], ngược lại với điều đó, là một cách linh hoạt hơn nhưng cũng tốn nhiều công sức hơn, để có được phiên bản chuỗi của thời gian, bởi vì bạn phải chuyển vào một chuỗi chỉ thị
01. 05 Nó trả về phiên bản chuỗi đã chỉ định dựa trên những gì bạn chuyển vào dưới dạng chỉ thị. time.strptime
[“thời gian phân tích cú pháp chuỗi”] thì ngược lại, trong đó nó nhận vào một chuỗi đã được định dạng sẵn và lệnh được sử dụng để định dạng chuỗi đó, đồng thời nó trả về đối tượng struct_time
dựa trên dữ liệu đó
01. 23 Nếu bạn chuyển không có chỉ thị nào, nó sẽ cho rằng chuỗi thời gian này ở định dạng dấu thời gian, vì vậy bạn có thể chuyển kết quả của time.asctime[]
, cho time.strptime
mà không có bất kỳ chỉ thị nào, và bạn sẽ nhận được một đối tượng chính xác là struct_time
từ đó
01. 37 Chúng ta hãy xem xét các chỉ thị này sâu hơn một chút. Các lệnh, còn được gọi là chuỗi định dạng, về cơ bản chỉ là ngôn ngữ của các ký tự đặc biệt cho phép bạn tạo các chuỗi định dạng, là sự kết hợp của các ký tự bình thường và các ký tự định dạng đặc biệt này, sau đó đưa ra đầu ra của một số định dạng ngày hoặc giờ
02. 00 Và vì vậy, ví dụ, nếu tôi vượt qua "%a, %B %d"
, tôi sẽ nhận được ngày trong tuần viết tắt cho struct_time
0 nhỏ,
02. 09 Tôi nhận được tên tháng đầy đủ cho struct_time
1 lớn, và sau đó tôi nhận được ngày thập phân không đệm cho struct_time
2. Và tất nhiên, dấu phẩy ở đây chỉ ở nguyên một vị trí vì nó không phải là một ký tự đặc biệt, và điều tương tự cũng xảy ra với định dạng struct_time
3 [“tháng/ngày/năm”] này, trong đó các dấu gạch chéo ở cùng một vị trí. Và sau đó, tất nhiên, dưới đây tất cả các từ và các chữ cái khác ở cùng một chỗ, ngoại trừ những thứ ngay sau dấu phần trăm
02. 35 Vì vậy, nó là một ngôn ngữ rất linh hoạt và nó hoạt động rất giống với cú pháp struct_time
4 của C nếu bạn đã quen thuộc với nó. Nếu không, đó không phải là vấn đề lớn, chỉ cần biết rằng các ký tự định dạng này được thay thế trực tiếp bằng thứ mà chúng tương ứng với ngày mà bạn đang thực sự sử dụng, ngày hoặc giờ mà bạn đang thực sự sử dụng để tạo
02. 55 Vì vậy, bạn chuyển một chuỗi định dạng và bạn chuyển một đối tượng thời gian, sau đó các trường này được điền tự động dựa trên dữ liệu từ đối tượng thời gian bởi struct_time
5 hoặc ngược lại, chúng được phân tích cú pháp bởi struct_time
6, vì vậy rất thuận tiện
03. 10 Hãy chuyển sang REPL Python và xem cách nó hoạt động trong thực tế. Như thường lệ, hãy bắt đầu bằng cách nhập struct_time
7
03. 18 Chức năng đầu tiên tôi muốn chỉ cho bạn là chức năng đơn giản nhất, chỉ là time.asctime
. Như bạn sẽ nhớ từ các slide trước, nó cần một bộ thời gian tùy chọn, nhưng nếu bạn không chuyển bất kỳ thứ gì vào đó, nó sẽ chỉ sử dụng giờ địa phương hiện tại và chuyển đổi nó thành dấu thời gian, như bạn có thể thấy ở đây. Vì vậy, hôm nay là Thứ Hai, ngày 4 tháng 5, "Mùng 4 tháng 5 sẽ ở bên bạn" và bây giờ là 13. 40 giờ chiều với 13 giây trôi qua vào năm 2020
03. 45 Điều này mang lại cho bạn gần như tất cả thông tin bạn có thể muốn biết về ngày tháng trong một kiểu lướt qua ngày và giờ, nhưng nó thực sự không linh hoạt lắm, bởi vì nó không cho phép bạn bao gồm ít hơn hoặc nhiều hơn
04. 02 Vì vậy, ví dụ: trong một ứng dụng lịch, sẽ không có ý nghĩa gì nếu có một tháng viết tắt và bạn cũng có thể muốn bao gồm tùy chọn có thời gian 12 giờ cho người dùng ở các quốc gia không có xu hướng sử dụng 24
04. 16 Có thể bạn cũng muốn có ngày trong tuần hoặc thứ gì đó tương tự, vì vậy có rất nhiều thông tin mà bạn có thể thêm hoặc xóa khỏi điều này, điều mà struct_time
9 không cho phép bạn làm
04. 25 Đó là nơi mà strftime[]
0 xuất hiện, và như bạn nhớ, bạn cần chuyển vào một chuỗi định dạng. Tôi sẽ bắt đầu với một cái gì đó đơn giản, chỉ năm, tháng và ngày
04. 36 Nó cũng nhận một tham số thứ hai tùy chọn, và để cho bạn thấy rằng điều này trên thực tế là giống nhau, tôi sẽ chuyển tham số này một cách rõ ràng, mặc dù đây là điều mà nó sẽ mặc định. Và như bạn có thể thấy, tôi nhận được năm 2020, tháng là tháng thứ 5 và ngày là ngày thứ 4
04. 54 Nhưng có thể bạn muốn một biểu diễn chuỗi dài dòng hơn, phù hợp hơn cho ứng dụng dựa trên văn bản hơn, vì vậy bạn có thể nói điều gì đó như, “Trong năm,
05. 05 strftime[]
1, đó là tháng mùa xuân ấm áp của strftime[]
2
05. 15 vào ngày, struct_time
2. ” Và tôi không cần truyền tham số này vào. Và thế là “Năm 2020, là một tháng xuân ấm áp 05 ngày 04. ” Nhưng điều này không hữu ích lắm, bởi vì rõ ràng là “tháng 05 mùa xuân ấm áp này,” điều đó không cho bạn biết nhiều, và vì vậy, điều bạn có thể muốn làm thay vào đó là thay thế điều này bằng số hoa struct_time
1, sẽ cung cấp đầy đủ
05. 38 Và sau đó bạn có thể thêm bất kỳ thứ gì khác nhau vào đây. Bạn có thể nhập tất cả các loại ký tự khác nhau, nhưng tôi sẽ để bạn thử với điều đó vào thời gian của riêng bạn, đặc biệt bằng cách xem tài liệu mô-đun struct_time
7, để tìm tất cả các ký tự định dạng khác nhau mà bạn có thể có để tạo thời gian của mình . Vì vậy, điều đó thật tốt và nó cho chúng tôi một cách để có tất cả, trừ những thông tin cần thiết, để truyền tải trong ứng dụng của bạn. Bây giờ, nếu bạn muốn đảo ngược điều này, bạn có thể sử dụng strftime[]
6
06. 06 Và như tôi đã đề cập trong các trang trình bày một giây trước, nếu bạn không cung cấp cho nó bất kỳ đối số định dạng cụ thể nào, nó sẽ chỉ cho rằng chuỗi được truyền vào là dấu thời gian
06. 16 Và vì vậy tôi sẽ chỉ sử dụng time.asctime[]
làm tham số chuỗi và sau đó tôi sẽ không chuyển vào tham số định dạng. Như bạn có thể thấy, điều này chỉ cho tôi thời gian hiện tại là một struct_time
06. 27 Vì vậy, đây là một cách siêu, siêu vòng vo để chỉ nói strftime[]
9. Và như bạn có thể thấy, những thứ này hóa ra gần như giống hệt nhau và "gần như" chỉ là do tôi đã gọi chúng vào những thời điểm khác nhau
06. 37 Vì vậy, đó là cách bạn có thể phân tích dấu thời gian, và sau đó nếu bạn muốn phân tích thứ gì đó phức tạp hơn, bạn có thể làm điều gì đó như thế này, nơi bạn cung cấp cho nó một chuỗi, và giả sử như 2020, hãy thực hiện chuỗi mà tôi đã tạo . Vì vậy, strftime[]
6 cực kỳ hữu ích, nhưng bạn cũng phải cẩn thận bởi vì, trong biểu diễn này, tôi không đưa ra giờ, phút, giây, ngày trong tuần, bất cứ thứ gì tương tự
07. 21 Ngày trong tuần được phân tích cú pháp, nhưng tôi không đưa ra giờ, phút, giây hay bất cứ thứ gì tương tự và tôi không chỉ định liệu thời gian có phải là tiết kiệm ánh sáng ban ngày hay không. Và vì vậy bạn thua, hoặc bạn không mất thông tin, nhưng có thông tin mà một struct_time
có thể truyền tải rằng lần này việc đại diện không thực sự công bằng
07. 37 Và vì vậy bạn phải cẩn thận với điều đó khi làm việc với những thời điểm này. Tôi muốn cho bạn thấy một điều nữa ở đây, đó là cách struct_time
5 và strftime[]
phản ứng khác nhau với những thay đổi về thông tin ngôn ngữ. Hãy để tôi xóa màn hình thật nhanh
07. 53 Điều tôi muốn chỉ cho bạn là làm thế nào, nếu bạn thay đổi ngôn ngữ, nó có thể thay đổi đầu ra của các hàm định dạng chuỗi của bạn, nhưng không phải cho tất cả chúng. Vì vậy, điều tôi muốn làm đầu tiên, trước khi thay đổi ngôn ngữ của mình, là tôi sẽ chỉ cho bạn thấy, tất nhiên, tôi phải struct_time
7, time.asctime
, và sau đó là struct_time
9
08. 14 Và những gì tôi sẽ làm là tôi sẽ chỉ sử dụng chỉ thị time.strptime
0, chỉ thị này sẽ trả về một dấu thời gian dành riêng cho ngôn ngữ. Vì vậy, như bạn có thể thấy, cả hai đều có cùng định dạng chính xác, nhưng bây giờ nếu tôi thay đổi ngôn ngữ của mình, vì vậy tôi sẽ nói time.strptime
1 và tôi phải vượt qua một danh mục, vì vậy nó sẽ là time.strptime
2, vì vậy thời gian
08. 51 Và sau đó, những gì tôi có thể làm là tôi sẽ cho bạn thấy, trước tiên, ________ 19, và như bạn có thể thấy, điều này hoàn toàn không thay đổi so với ngôn ngữ khác, đó là tiếng Anh Hoa Kỳ. Đó là ngôn ngữ đầu tiên của tôi. Tôi đã không thực sự in nó ra, nhưng đó là những gì nó được. Đó là time.strptime
6
09. 10 Vì vậy, điều đó không thay đổi, struct_time
9, nhưng nếu tôi làm struct_time
9 và tôi thông qua nó trong chỉ thị time.strptime
0 này, thì điều đó thực sự thay đổi để phản ánh sự khác biệt về chính tả từ tiếng Đức. Vì vậy, "Mai" trái ngược với "May" và "Montag", trái ngược với "Thứ Hai" và chúng có các chữ viết tắt khác nhau trong các ngôn ngữ khác nhau
09. 33 Vì vậy, bạn có thể thấy rằng strftime[]
thực sự nhạy cảm với dữ liệu cụ thể theo ngôn ngữ. Và bạn cũng có thể thấy điều này, nếu tôi làm điều gì đó giống như, tôi sẽ nói, hãy làm tên đầy đủ của tháng. Và như bạn có thể thấy, đó là struct_time
1, vì vậy struct_time
9 nhạy cảm với ngôn ngữ
09. 51 Đó là điều thực sự quan trọng cần lưu ý khi bạn sử dụng các chức năng này. bạn muốn luôn đảm bảo rằng bạn biết điều gì sẽ thay đổi dựa trên ngôn ngữ của người dùng của bạn. Với ý nghĩ đó, trong bài học tiếp theo, tôi sẽ chỉ lướt qua một vài hàm nhỏ nhanh chóng mà mô-đun thời gian cung cấp để hoạt động với hiệu suất trong Python
10. 11 Đó sẽ là đo lường hiệu suất bằng bộ đếm thời gian chính xác, sau đó cũng cho phép thực thi luồng hiện tại của bạn ở chế độ ngủ và các lợi ích khác nhau có thể có