JavaRush /Blog Java /Random-VI /Làm thế nào để không bị lạc thời gian - DateTime và Calen...

Làm thế nào để không bị lạc thời gian - DateTime và Calendar

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ bắt đầu làm việc với một kiểu dữ liệu mới mà trước đây chúng ta chưa từng gặp, đó là ngày tháng. Làm thế nào để không bị lạc thời gian - DateTime và Calendar - 1Tôi nghĩ không cần phải giải thích ngày là gì :) Về nguyên tắc, hoàn toàn có thể viết ngày và giờ hiện tại bằng Java dưới dạng một chuỗi thông thường.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
Nhưng cách tiếp cận này có nhiều nhược điểm. Lớp Stringđượ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ó Stringsẽ 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 String: 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ớpjava.util.Date

Lớp ngày Java

Chúng tôi đặt tên đầy đủ cho nó vì cũng có một lớp trong gói khác trong Java java.sql.Date. Đừ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 Datecó 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 . StringBạ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 Dategiải quyết nó một cách dễ dàng.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
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 Date: 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:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Đầu ra của bảng điều khiển:

Fri May 30 08:20:12 MSD 2008
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 long, vì số lượng của chúng thường không vừa với int. 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 . Date.getTime(), 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:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
Phần kết luận:

date1 раньше date2
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 Date: before(), after()equals(). Tất cả đều trả về kết quả ở dạng boolean. Phương thức này before()kiể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:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
Đầu ra của bảng điều khiển:

true
Phương thức này hoạt động theo cách tương tự after(); 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:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
Đầu ra của bảng điều khiển:

false
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 date1date2có thể ít hơn một phần nghìn giây, trong trường hợp đó cả và before()after()sẽ trả về false. Nhưng phương pháp equals()trong tình huống như vậy sẽ trở lại true! 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:
public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
Đâ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 Datetrê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à Deprecated(“không được dùng nữa”). Đây, hãy xem: Ngày học Đâ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 Date.getHours(), trả về số giờ từ đối tượng Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
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: Làm thế nào để không bị lạc thời gian - DateTime và Calendar - 2Hầ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 Calendar. Chúng ta sẽ tìm hiểu anh ấy nhiều hơn :)

Lịch Java

Java 1.1 đã giới thiệu một lớp mới - Calendar. 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 Calendarmà chúng ta sẽ làm việc là lớp GregorianCalendar(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ể:
  • Thêm tháng hoặc ngày vào ngày hiện tại
  • Kiểm tra xem năm đó có phải là năm nhuận hay không;
  • Nhận các thành phần ngày riêng lẻ (ví dụ: lấy số tháng từ toàn bộ ngày)
  • Ngoài ra, một hệ hằng số rất tiện lợi đã được phát triển bên trong nó (chúng ta sẽ thấy nhiều hằng số trong số đó bên dưới).
Một điểm khác biệt quan trọng khác của lớp Calendarlà nó thực hiện một hằng số Calendar.Era: 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:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Các tháng trong lớp Calendar(nhân Datetiệ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 Calendarlà 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. Làm thế nào để không bị lạc thời gian - DateTime và Calendar - 3Ngà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:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
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 toString()trong lớp hoạt động Calendar). 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 Date- việc này được thực hiện bằng cách sử dụng một phương thức Calendar.getTime()(tên không hợp lý nhất, nhưng không thể làm được gì):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
Phần kết luận:

Wed Jan 25 00:00:00 MSK 2017
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, Calendarcá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 Calendarcó 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ã.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY- 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 Calendar.APRIL- 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 set(). Điều này rất thuận tiện vì Calendarmỗ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
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
Phần kết luận:

Wed Jan 25 19:42:12 MSK 2017
Chúng ta gọi phương thức này set(), 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 set()là 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 Calendarđược thực hiện bằng cách sử dụng add(). 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:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2);//to subtract a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
Phần kết luận:

Fri Nov 25 19:42:12 MSK 2016
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 roll()có 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:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
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:

Sat Nov 25 10:42:12 MSK 2017
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 Calendarcó 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 get():
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

   System.out.println("Number: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Watch: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
Phần kết luận:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
Tức là, ngoài “super-setter” trong lớp Calendarcò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 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 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.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Ở đâ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 (các chữ cái “GG” chịu trách nhiệm hiển thị thời đại). Phần kết luận:

02 авг 216 до н.э.
CalendarCò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. Làm thế nào để không bị lạc thời gian - DateTime và Calendar - 5Đổ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:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
Trong ví dụ trên, chúng tôi đã sử dụng mẫu "yyyy-MM-dd HH:mm:ss" có nghĩa là:
  • 4 chữ số cho năm (yyyy);
  • 2 chữ số cho tháng (MM);
  • 2 chữ số cho ngày (dd);
  • 2 chữ số giờ ở định dạng 24 giờ (HH);
  • 2 chữ số cho phút (mm);
  • 2 chữ số cho giây (ss).
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:
2008-05-30 08:20:12
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.
  1. Tạo một dòng mà bạn cần đặt ngày:

    String strDate = "Sat, April 4, 2020";
  2. Chúng tôi tạo một đối tượng SimpleDateFormat mới với mẫu khớp với những gì chúng tôi có trong chuỗi (nếu không chúng tôi sẽ không thể phân tích cú pháp nó):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

    Như bạn có thể thấy, chúng ta có đối số Locale ở đây. Nếu chúng ta bỏ qua nó, nó sẽ sử dụng Ngôn ngữ mặc định, không phải lúc nào cũng là tiếng Anh.

    Nếu ngôn ngữ không khớp với chuỗi đầu vào thì dữ liệu chuỗi liên kết với ngôn ngữ, như Mon hoặc April của chúng tôi , sẽ không được nhận dạng và sẽ tạo ra ngoại lệ java.text.ParseException, ngay cả khi mẫu khớp.

    Tuy nhiên, chúng tôi không phải chỉ định định dạng nếu chúng tôi đang sử dụng mẫu không dành riêng cho ngôn ngữ. Ví dụ - yyyy-MM-dd HH:mm:ss

  3. Chúng tôi tạo một ngày bằng cách sử dụng một trình định dạng, từ đó phân tích nó từ chuỗi đầu vào:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    Đầu ra của bảng điều khiển:

    
    Sat Apr 04 00:00:00 EEST 2020

    Hmmm... Nhưng định dạng không còn giống nhau nữa!

    Để tạo định dạng tương tự, chúng tôi sử dụng lại trình định dạng:

    System.out.println(formatter.format(date));

    Đầu ra của bảng điều khiển:

    
    Sat, April 4, 2020

SimpleDateFormat và Lịch

SimpleDateFormat 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.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Ở đâ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:

02 авг 216 до н.э.

Đị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:

Sat Nov 25 10:42:12 MSK 2017
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:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
Phần kết luận:

суббота, 25 Ноябрь 2017
Tốt hơn nhiều, phải không? :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION