Bài tập xử lý ngày tháng trong java năm 2024
Nhưng cách tiếp cận này có nhiều nhược điểm. Lớp
0được tạo để làm việc với văn bản và có các phương thức thích hợp. Nếu chúng ta cần quản lý ngày bằng cách nào đó (ví dụ: thêm 2 giờ vào đó), thì nó
0sẽ không hoạt động ở đây. Hoặc, ví dụ: hiển thị ngày giờ hiện tại tại thời điểm chương trình được biên dịch vào bảng điều khiển. Điều đó cũng chẳng giúp ích được gì ở đây
0: trong khi bạn viết mã và chạy nó, thời gian sẽ thay đổi và những thông tin không liên quan sẽ được hiển thị trong bảng điều khiển. Do đó, trong Java, người tạo ra nó đã cung cấp một số lớp để làm việc với ngày và giờ. Đầu tiên là lớp
3 Lớp ngày JavaChúng tôi đặt tên đầy đủ cho nó vì cũng có một lớp trong gói khác trong Java
4. Đừng nhầm lẫn! Điều đầu tiên bạn cần biết về nó là nó lưu trữ ngày tính bằng mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970. Thậm chí còn có một tên riêng cho ngày này - “Unix time”. Một cách khá thú vị, bạn có đồng ý không? :) Điều thứ hai cần nhớ: nếu bạn tạo một đối tượng
5có hàm tạo trống, kết quả sẽ là ngày giờ hiện tại tại thời điểm đối tượng được tạo .
0Bạn có nhớ chúng tôi đã viết rằng một tác vụ như vậy sẽ có vấn đề đối với định dạng ngày không? Cả lớp
5giải quyết nó một cách dễ dàng.
Chạy mã này nhiều lần và bạn sẽ thấy thời gian sẽ thay đổi như thế nào mỗi lần :) Điều này có thể thực hiện được chính xác vì nó được lưu trữ tính bằng mili giây: chúng là đơn vị thời gian nhỏ nhất, đó là lý do tại sao kết quả rất chính xác. Có một hàm tạo khác cho
5: bạn có thể chỉ định chính xác số mili giây đã trôi qua từ 00:00 ngày 1 tháng 1 năm 1970 đến ngày được yêu cầu và nó sẽ được tạo:
Đầu ra của bảng điều khiển:
Chúng tôi đã nhận được nó vào ngày 30 tháng 5 năm 2008. “Thứ Sáu” có nghĩa là ngày trong tuần - “Thứ Sáu” (Thứ Sáu) và MSD - “Tiết kiệm ánh sáng ban ngày ở Moscow” (giờ mùa hè ở Moscow). Một phần nghìn giây được truyền ở định dạng
9, vì số lượng của chúng thường không vừa với
0. Vì vậy, loại hoạt động ngày nào chúng ta có thể cần trong công việc của mình? Tất nhiên, điều rõ ràng nhất là sự so sánh . Xác định xem một ngày muộn hơn hay sớm hơn ngày khác. Điều này có thể được thực hiện theo những cách khác nhau. Ví dụ: bạn có thể gọi phương thức .
1, phương thức này sẽ trả về số mili giây đã trôi qua kể từ nửa đêm ngày 1 tháng 1 năm 1970. Hãy gọi nó trên hai đối tượng Date và so sánh chúng với nhau:
Phần kết luận:
Nhưng có một cách thuận tiện hơn, đó là sử dụng các phương thức đặc biệt của lớp
5:
3,
4và
5. Tất cả đều trả về kết quả ở dạng
6. Phương thức này
3kiểm tra xem ngày của chúng ta có sớm hơn ngày chúng ta chuyển làm đối số hay không:
Đầu ra của bảng điều khiển:
Phương thức này hoạt động theo cách tương tự
4; nó kiểm tra xem ngày của chúng ta có muộn hơn ngày chúng ta chuyển làm đối số hay không: Đầu ra của bảng điều khiển:
Trong ví dụ của chúng tôi, chúng tôi đặt chương trình ở chế độ ngủ trong 2 giây để đảm bảo hai ngày khác nhau. Trên các máy tính nhanh, thời gian giữa việc tạo
9và
0có thể ít hơn một phần nghìn giây, trong trường hợp đó cả và
3và
4sẽ trả về
3. Nhưng phương pháp
5trong tình huống như vậy sẽ trở lại
5! Rốt cuộc, nó so sánh chính xác số mili giây đã trôi qua kể từ 00:00 ngày 1 tháng 1 năm 1970 cho mỗi ngày. Các đối tượng sẽ chỉ được coi là bằng nhau nếu chúng khớp với nhau đến từng mili giây:
0 Đây là một cái gì đó khác bạn cần chú ý đến. Nếu bạn mở tài liệu về lớp này
5trên trang web của Oracle, bạn sẽ thấy nhiều phương thức và hàm tạo của nó đã được chỉ định là
7(“không được dùng nữa”). Đây, hãy xem: Đây là điều mà chính những người tạo ra Java nói về những phần của lớp đã không còn được dùng nữa: “Phần tử chương trình được chú thích bằng @Deprecated là thứ mà các lập trình viên không khuyến khích sử dụng, thường là vì nó nguy hiểm hoặc vì điều đó có một sự thay thế tốt hơn.” Điều này không có nghĩa là những phương pháp này hoàn toàn không thể được sử dụng. Hơn nữa, nếu bản thân bạn cố gắng chạy mã bằng cách sử dụng chúng trong IDEA, rất có thể nó sẽ hoạt động. Hãy lấy ví dụ về phương thức không được dùng nữa
8, trả về số giờ từ đối tượng
5.
1 Ví dụ: nếu tại thời điểm bạn chạy mã, thời gian là 14:21, nó sẽ hiển thị số 14. Như bạn có thể thấy, phương thức không dùng nữa sẽ bị gạch bỏ, nhưng nó hoạt động khá tốt. Các phương thức này không bị loại bỏ hoàn toàn để không làm hỏng một loạt mã đã được viết bằng chúng. Nghĩa là, những phương pháp này không bị “hỏng” hoặc “bị loại bỏ”, chúng chỉ đơn giản là không được khuyến khích sử dụng do có sẵn một giải pháp thay thế thuận tiện hơn. Nhân tiện, nó được viết về nó ngay trong tài liệu: Hầu hết các phương thức của lớp Date đã được chuyển sang phiên bản mở rộng, cải tiến của nó - lớp
0. Chúng ta sẽ tìm hiểu anh ấy nhiều hơn :) Lịch JavaJava 1.1 đã giới thiệu một lớp mới -
0. Anh ấy đã làm cho việc xử lý ngày tháng trong Java dễ dàng hơn một chút so với trước đây. Việc triển khai duy nhất của lớp
0mà chúng ta sẽ làm việc là lớp
3(nó triển khai lịch Gregorian, theo lịch mà hầu hết các quốc gia trên thế giới đều sinh sống). Tiện lợi chính của nó là nó có thể làm việc với ngày tháng ở định dạng thuận tiện hơn. Ví dụ: anh ấy có thể:
Một điểm khác biệt quan trọng khác của lớp
0là nó thực hiện một hằng số
5: bạn có thể đặt ngày thành thời đại BC (“Trước Chúa Kitô” - trước sự ra đời của Chúa Kitô, tức là “trước thời đại của chúng ta”) hoặc AC (“Sau Chúa Kitô” - “ thời đại của chúng ta"). Hãy xem xét tất cả điều này với các ví dụ. Cùng tạo lịch ngày 25/01/2017:
2 Các tháng trong lớp
0(nhân
5tiện, như trong ,) bắt đầu từ 0, vì vậy chúng ta đã chuyển số 0 làm đối số thứ hai. Điều chính khi làm việc với một lớp
0là phải hiểu rằng đây là một lịch chứ không phải một ngày riêng biệt. Ngày chỉ đơn giản là một dãy số biểu thị một khoảng thời gian cụ thể. Và lịch là cả một thiết bị mà bạn có thể thực hiện rất nhiều việc với ngày tháng :) Điều này có thể thấy khá rõ nếu bạn cố gắng xuất đối tượng Lịch ra bàn điều khiển: Đầu ra:
3 Hãy xem có bao nhiêu thông tin! Lịch có một loạt thuộc tính mà ngày thông thường không có và tất cả chúng đều được xuất ra bảng điều khiển (đây là cách phương thức
9trong lớp hoạt động
0). Nếu khi làm việc, bạn chỉ cần lấy một ngày đơn giản trên lịch, tức là. đối tượng
5- việc này được thực hiện bằng cách sử dụng một phương thức
2(tên không hợp lý nhất, nhưng không thể làm được gì):
4 Phần kết luận:
5 Bây giờ chúng ta đã “đơn giản hóa” lịch thành một ngày thông thường. Tiếp tục nào. Ngoài các ký hiệu số trong tháng,
0các hằng số có thể được sử dụng trong lớp học. Hằng số là các trường tĩnh của một lớp
0có giá trị đã được đặt sẵn và không thể thay đổi. Tùy chọn này thực sự tốt hơn vì nó cải thiện khả năng đọc mã.
6
5- một trong những hằng số để chỉ tháng. Với tùy chọn đặt tên này, sẽ không ai quên, chẳng hạn như số “3” có nghĩa là tháng Tư, chứ không phải tháng thứ ba mà chúng ta quen dùng - tháng Ba. Bạn chỉ cần viết
6- và thế là xong :) Tất cả các trường lịch (ngày, tháng, phút, giây, v.v.) có thể được đặt riêng lẻ bằng phương thức
7. Điều này rất thuận tiện vì
0mỗi trường có hằng số riêng trong lớp và mã cuối cùng sẽ trông đơn giản nhất có thể. Ví dụ: trong ví dụ trước, chúng tôi đã tạo một ngày nhưng không đặt thời gian hiện tại cho ngày đó. Hãy đặt thời gian là 19:42:12
7 Phần kết luận:
8 Chúng ta gọi phương thức này
7, truyền một hằng số cho nó (tùy thuộc vào trường mà chúng ta muốn thay đổi) và một giá trị mới cho trường này. Hóa ra phương thức này
7là một loại "siêu thiết lập" có thể đặt giá trị không phải cho một trường mà cho nhiều trường :) Việc cộng và trừ các giá trị trong một lớp
0được thực hiện bằng cách sử dụng
2. Bạn cần chuyển vào đó trường mà bạn muốn thay đổi và số - chính xác là bạn muốn cộng/trừ bao nhiêu từ giá trị hiện tại. Ví dụ: hãy đặt ngày chúng tôi tạo trở lại 2 tháng trước:
9 Phần kết luận:
0 Tuyệt vời! Chúng tôi đã ấn định ngày trở lại 2 tháng trước. Kết quả là, không chỉ tháng mà cả năm cũng đã thay đổi, từ 2017 sang 2016. Tất nhiên, việc tính toán năm hiện tại khi chuyển ngày được thực hiện tự động và không cần phải điều khiển thủ công. Nhưng nếu vì mục đích nào đó bạn cần vô hiệu hóa hành vi này, bạn có thể làm điều đó. Một phương thức đặc biệt
3có thể cộng và trừ các giá trị mà không ảnh hưởng đến các giá trị khác. Ví dụ như thế này:
1 Chúng tôi đã làm chính xác như trong ví dụ trước - chúng tôi đã trừ đi 2 tháng kể từ ngày hiện tại. Nhưng bây giờ mã đã hoạt động khác: tháng thay đổi từ tháng 1 sang tháng 11, nhưng năm vẫn giữ nguyên như năm 2017! Phần kết luận:
2 Hơn nữa. Như chúng tôi đã nói ở trên, tất cả các trường của một đối tượng
0có thể được lấy riêng biệt. Phương pháp này chịu trách nhiệm cho việc này
5:
3 Phần kết luận:
4 Tức là, ngoài “super-setter” trong lớp
0còn có một “super-getter” :) Một điểm thú vị khác tất nhiên là làm việc với các thời đại. Để tạo ngày “BC”, bạn cần sử dụng trường
5 Ví dụ: hãy tạo một ngày biểu thị Trận chiến Cannae, trong đó Hannibal đã đánh bại quân đội La Mã. Điều này xảy ra vào ngày 2 tháng 8 năm 216 trước Công nguyên. e.:
5 Ở đây, chúng tôi đã sử dụng lớp
8để hiển thị ngày ở định dạng mà chúng tôi dễ hiểu hơn (các chữ cái “GG” chịu trách nhiệm hiển thị thời đại). Phần kết luận:
6
0Còn có nhiều phương thức và hằng số khác trong lớp , hãy đọc về chúng trong tài liệu:
Dòng mới cho đến ngàyĐể chuyển đổi Chuỗi thành Ngày, bạn có thể sử dụng lớp trợ giúp Java - SimpleDateFormat . Đây là lớp bạn cần để chuyển đổi ngày sang định dạng do bạn xác định. Đổi lại, nó rất giống với DateFormat . Sự khác biệt đáng chú ý duy nhất giữa hai loại này là SimpleDateFormat có thể được sử dụng để định dạng (chuyển đổi ngày thành chuỗi) và phân tích chuỗi thành ngày nhận biết ngôn ngữ, trong khi DateFormat không hỗ trợ ngôn ngữ. Ngoài ra, DateFormat là một lớp trừu tượng cung cấp hỗ trợ cơ bản cho việc định dạng và phân tích ngày tháng, trong khi SimpleDateFormat là một lớp cụ thể mở rộng lớp DateFormat. Đây là ví dụ về việc tạo đối tượng SimpleDateFormat và định dạng Ngày:
7 Trong ví dụ trên, chúng tôi đã sử dụng mẫu "yyyy-MM-dd HH:mm:ss" có nghĩa là:
Các dấu phân tách và thứ tự của các ký hiệu mẫu được giữ nguyên. Đầu ra của bảng điều khiển:
8 Có khá nhiều mẫu chữ cho lớp SimpleDateFormat . Để bạn không bị nhầm lẫn, chúng tôi đã tập hợp chúng thành một bảng: Biểu tượng Sự miêu tả Ví dụ G thời đại (theo bản địa hóa tiếng Anh - AD và BC) QUẢNG CÁO y năm (số có 4 chữ số) 2020 ừ năm (2 chữ số cuối) 20 yyyy năm (số có 4 chữ số) 2020 M số tháng (không có số 0 đứng đầu) số 8 MM số tháng (có số 0 đứng đầu nếu số tháng < 10) 04 MMM viết tắt tháng ba chữ cái (theo bản địa hóa) Tháng một MMMM tên tháng đầy đủ Tháng sáu w tuần trong năm (không có số 0 đứng đầu) 4 ôi tuần trong năm (có số 0 đứng đầu) 04 W tuần trong tháng (không có số 0 đứng đầu) 3 thế giới tuần trong tháng (có số 0 đứng đầu) 03 D ngày trong năm 67 d ngày trong tháng (không có số 0 đứng đầu) 9 đ ngày trong tháng (có số 0 đứng đầu) 09 F ngày trong tuần trong tháng (không có số 0 đứng đầu) 9 FF ngày trong tuần trong tháng (có số 0 đứng đầu) 09 E ngày trong tuần (viết tắt) W EEEE ngày trong tuần (đầy đủ) Thứ sáu bạn số ngày trong tuần (không có số 0 đứng đầu) 5 ừ số ngày trong tuần (có số 0 đứng đầu) 05 Một Điểm đánh dấu AM/PM LÀ. H giờ ở định dạng 24 giờ không có số 0 đứng đầu 6 HH đồng hồ ở định dạng 24 giờ với số 0 đứng đầu 06 k số giờ ở định dạng 24 giờ 18 K số giờ ở định dạng 12 giờ 6 h thời gian ở định dạng 12 giờ không có số 0 đứng đầu 6 hh thời gian ở định dạng 12 giờ với số 0 đứng đầu 06 tôi phút không có số 0 đứng đầu 32 mm phút có số 0 đứng đầu 32 S giây không có số 0 đứng đầu mười một ss giây có số 0 đứng đầu mười một S mili giây 297 z Múi giờ EET Z múi giờ ở định dạng RFC 822 300 Ví dụ về sự kết hợp ký tự mẫu: Vật mẫu Ví dụ dd-MM-yyyy 01-11-2020 yyyy-MM-dd 2019-10-01 HH:mm:ss.SSS 23:59.59.999 yyyy-MM-dd HH:mm:ss 2018-11-30 03:09:02 yyyy-MM-dd HH:mm:ss.SSS 2016-03-01 01:20:47.999 yyyy-MM-dd HH:mm:ss.SSS Z 2013-13-13 23:59:59.999 +0100 Nếu bạn mắc một lỗi nhỏ với định dạng, bạn có thể trở thành chủ sở hữu của java.text.ParseException và đây không phải là một thành tích đặc biệt dễ chịu. Chà, chuyến tham quan ngắn vào SimpleDateFormat đã kết thúc - hãy quay lại bản dịch chuỗi java thành date . SimpleDateFormat cung cấp cho chúng tôi những khả năng như vậy và chúng tôi sẽ thực hiện từng bước quy trình này.
SimpleDateFormat và LịchSimpleDateFormat cho phép bạn định dạng tất cả các đối tượng Ngày và Lịch mà bạn tạo để sử dụng sau này. Hãy xem xét một điểm thú vị khi làm việc với các thời đại. Để tạo ngày "BC", bạn cần sử dụng trường Calendar.Era. Ví dụ: hãy tạo một ngày biểu thị Trận chiến Cannae, trong đó Hannibal đã đánh bại quân đội Rome. Điều này xảy ra vào ngày 2 tháng 8 năm 216 trước Công nguyên. e.:
5 Ở đây, chúng tôi đã sử dụng lớp SimpleDateFormat để hiển thị ngày ở định dạng mà chúng tôi dễ hiểu hơn (như đã nêu ở trên, các chữ cái “GG” chịu trách nhiệm hiển thị thời đại). Phần kết luận:
6 Định dạng ngày JavaĐây là một trường hợp khác. Giả sử rằng định dạng ngày này không phù hợp với chúng tôi:
2 Vì vậy, nó ở đây. Bằng cách sử dụng các khả năng của chúng tôi ở định dạng ngày java, bạn có thể thay đổi nó thành định dạng ngày của riêng bạn mà không gặp nhiều khó khăn: |