1. Dateคลาสและเวลา Unix

จากจุดเริ่มต้นของ Java ภาษามีคลาสพิเศษสำหรับการทำงานกับเวลาและวันที่Date— เมื่อเวลาผ่านไปมีคลาสเพิ่มเติมสำหรับการทำงานกับวันที่ปรากฏขึ้น แต่โปรแกรมเมอร์ยังคงใช้คลาสต่อไปDateแม้กระทั่งทุกวันนี้

เพราะมันง่ายและสะดวกมาก และในฐานะโปรแกรมเมอร์คุณจะต้องพบเจอมันอย่างแน่นอนในทุกโปรเจกต์จริง ๆ จะใช้หรือไม่ใช้ก็ได้ แต่คุณต้องรู้ ดังนั้นให้เวลาอันมีค่าของคุณสักสองสามนาที

อะไรที่ทำให้Dateชั้นเรียนดี? ความเรียบง่าย

คลาสDateเก็บข้อมูลวันที่และเวลาเป็นจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970ซึ่งเป็นมิลลิวินาทีจำนวนมาก ดังนั้นlongประเภทจึงใช้เพื่อจัดเก็บ

น่าสนใจ.

ทำไมตั้งแต่ปี 1970 โดยเฉพาะ? สิ่งนี้เรียกว่าUnix time : มันเป็นวิธีที่ระบบปฏิบัติการ Unix ซึ่งเป็นปู่ของระบบปฏิบัติการสมัยใหม่ทั้งหมดรักษาเวลา

แต่คุณสามารถค้นหาได้อย่างง่ายดายว่าเวลาผ่านไปเท่าใดระหว่างวันที่สองวัน: เพียงลบหนึ่งวันออกจากอีกวัน และคุณจะได้ค่าความแตกต่างของเวลาระหว่างวันที่เป็นมิลลิวินาทีที่ใกล้ที่สุด

ต่อไปนี้คือตัวอย่างที่เป็นประโยชน์ของการทำงานกับDateชั้นเรียน


2. รับวันที่ปัจจุบัน

หากต้องการดูเวลาและวันที่ปัจจุบัน เพียงสร้างDateวัตถุ อ็อบเจกต์ใหม่แต่ละรายการจะเก็บเวลาที่ถูกสร้างขึ้น มันดูง่ายมาก:

Date current = new Date();

หลังจากดำเนินการคำสั่งนี้currentตัวแปรจะจัดเก็บการอ้างอิงไปยังDateออบเจกต์ที่สร้างขึ้น ซึ่งจะเก็บเวลาที่สร้างไว้ภายใน ซึ่งเป็นจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970

การแสดงวันที่ปัจจุบันบนหน้าจอ

ในการแสดงวันที่ปัจจุบัน เพียงแค่: a) สร้างDateวัตถุใหม่ b) พิมพ์ไปยังหน้าจอโดยใช้System.out.println()วิธีการ

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

นี่คือความหมายของเอาต์พุตคอนโซล:

ข้อความ การตีความ
พฤหัสบดี _ วันพฤหัสบดี
วันที่ 21 ก.พ 21 กุมภาพันธ์
14:01:34น ชั่วโมง : นาที : วินาที
กท เขตเวลา: เวลายุโรปตะวันออก
2019 ปี

3. การตั้งค่าวันที่เฉพาะ

เราทราบวิธีรับเวลาปัจจุบัน แต่เราจะสร้างDateวัตถุที่เก็บวันที่หรือเวลาอื่น ได้อย่างไร

อีกครั้งทุกอย่างง่ายที่นี่ หากต้องการกำหนดวันที่เฉพาะ คุณต้องเขียนโค้ดดังนี้:

Date birthday = new Date(year, month, day);

ทุกอย่างเรียบง่ายและชัดเจน แต่มีความแตกต่างสองประการที่ต้องระวัง:

  1. ปีจะต้องนับจาก 1900
  2. เดือนมีหมายเลขจากศูนย์
น่าสนใจ.

นี่เป็นอีกหนึ่งมรดกของระบบปฏิบัติการ Unix: บน Unix โปรแกรมเมอร์จะแสดงปีโดยใช้ตัวเลขสองหลัก แทนที่จะเป็นปี 1977 พวกเขาเขียนว่า 77 ดังนั้น 77 จึงเป็นปีที่ถูกต้องหากนับจากปี 1900

ตัวอย่างเช่น ฉันเกิดวันที่ 21 มีนาคม พ.ศ. 2532 มีนาคมเป็นเดือนที่ 3 ดังนั้นฉันต้องเขียน:

รหัส เอาต์พุตคอนโซล
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

เดือนมีเลขจากศูนย์ แต่วันไม่ใช่ แปลกนิดหน่อยใช่ไหม?

เราคิดว่าโปรแกรมเมอร์ที่แท้จริงควรจะมีชัยและนับวันของเดือนจากศูนย์เช่นกัน โอ้ผู้คล้อยตามเหล่านี้🙂

การตั้งเวลาเฉพาะ

การตั้งเวลาที่เฉพาะเจาะจงนั้นค่อนข้างง่าย สำหรับสิ่งนี้ คุณต้องเขียนคำสั่งดังนี้:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

ชั่วโมง นาที และวินาทีเป็นเลขศูนย์: ให้โปรแกรมเมอร์ที่อยู่ในตัวคุณถอนหายใจด้วยความโล่งอก

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

เราตั้งเวลา12:15 น.และวันที่4 มิถุนายน 2548 . นี่เป็นเรื่องยากเล็กน้อยสำหรับผู้ที่ไม่ใช่โปรแกรมเมอร์ในการอ่าน แต่ก็ใช้งานได้ตามที่ควร


4. การทำงานกับองค์ประกอบของวันที่

คุณสามารถทำอะไรกับDateวัตถุได้มากกว่าแค่แสดง มีวิธีการที่ช่วยให้คุณได้รับแต่ละองค์ประกอบของวันที่จัดเก็บภายใน:

วิธี คำอธิบาย
int getYear()
ส่งกลับปีของวันที่เทียบกับ 1900
int getMonth()
ส่งกลับเดือนของวันที่ (เดือนเป็นเลขจากศูนย์)
int getDate()
ส่งกลับวันของเดือน
int getDay()
ส่งกลับวันในสัปดาห์
int getHours()
ส่งกลับชั่วโมง
int getMinutes()
ส่งกลับนาที
int getSeconds()
คืนค่าวินาที

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล บันทึก
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2548 วัน เสาร์ เดือน
มิถุนายน

อย่างไรก็ตามDateวัตถุไม่เพียงแต่ช่วยให้คุณได้รับองค์ประกอบแต่ละรายการของวันที่เท่านั้น แต่ยังเปลี่ยนองค์ประกอบเหล่านี้ได้ด้วย:

วิธี คำอธิบาย
void setYear(int year) เปลี่ยนปีของวันที่ มีการระบุปีเทียบกับปี 1900
void setMonth(int month) เปลี่ยนเดือนของวันที่ (เดือนนับจากศูนย์)
void setDate(int date) เปลี่ยนวันของเดือน
void setHours(int hours) เปลี่ยนชั่วโมง
void setMinutes(int minutes) เปลี่ยนนาที
void setSeconds(int seconds) เปลี่ยนวินาที

5. มิลลิวินาที

ดังที่เรากล่าวไว้ก่อนหน้านี้Dateออบเจ็กต์จะเก็บจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970

ถ้าเราต้องการตัวเลขนั้น เราสามารถหาได้จากวัตถุDate:

long time = date.getTime();

เมธอดgetTime()ส่งคืนจำนวนมิลลิวินาทีที่เก็บไว้ภายในDateวัตถุ

ไม่เพียงแต่คุณจะได้จำนวนมิลลิวินาทีเท่านั้น แต่คุณยังสามารถเปลี่ยนตัวเลขนั้นในออบเจกต์ที่มีอยู่ได้ด้วย:

Date date = new Date();
date.setTime(1117876500000L);

อย่างไรก็ตาม คุณสามารถเขียนสิ่งนี้ให้กระชับยิ่งขึ้นโดยส่งเวลาไปยังวัตถุDateทันทีเมื่อสร้าง:

Date date = new Date(1117876500000L);

6. การเปรียบเทียบวันที่

หากคุณต้องการเปรียบเทียบวันที่สองวันและดูว่าวันใดมาก่อน คุณมีสามตัวเลือก

วิธีแรกคือเปรียบเทียบจำนวนมิลลิวินาทีที่แต่ละร้านจัดเก็บ:

if (date1.getTime() < date2.getTime())

วิธีที่สองคือการใช้before()วิธีการของDateวัตถุ:

if (date1.before(date2))

มันอ่านดังนี้ ถ้าdate1มาก่อนdate2ก็...

วิธีที่สามคือการใช้after()วิธีการของDateวัตถุ:

if (date2.after(date1))

มันอ่านดังนี้: if date2is after date1, then...


7. DateFormatชั้นเรียน

โปรดจำไว้ว่าเมื่อเราแสดงวันที่บนหน้าจอ เราจะเห็นสิ่งนี้Thu Feb 21 14:01:34 EET 2019: ทุกอย่างดูเหมือนถูกต้อง แต่รูปแบบคือวิธีการแสดงวันที่สำหรับโปรแกรมเมอร์มากกว่ามนุษย์ทั่วไป เราต้องการแสดงวันที่ให้ชัดเจนยิ่งขึ้นสำหรับผู้ใช้ บางอย่างเช่นTuesday, February 21.

และไม่มีปี หรือหนึ่งปีหากจำเป็น โดยทั่วไป เราต้องการแสดงวันที่ในรูปแบบต่างๆ

มีคลาสพิเศษสำหรับสิ่งนี้: SimpleDateFormat.

ตัวอย่าง:

รหัส
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
เอาต์พุตคอนโซล
Jun-04-2005

ดูสิ่งที่โปรแกรมแสดง: Jun-04-2005. นั่นไม่ใช่สิ่งที่เคยเป็นเลย

ความแตกต่างคือเราไม่ได้แสดงDateวัตถุ แต่เป็นสตริงพิเศษที่ได้รับจากการเรียกใช้format()เมธอดบนSimpleDateFormatวัตถุ แต่นั่นไม่ใช่ประเด็นหลักที่นี่

เมื่อSimpleDateFormatสร้างออบเจกต์แล้ว เราจะส่งสตริง"MMM-dd-YYYY"เป็นพารามิเตอร์ สตริงนี้สื่อถึงรูปแบบวันที่ที่เราเห็นในเอาต์พุตคอนโซล

  • MMM หมายถึงการแสดงชื่อเดือนโดยย่อโดยใช้ตัวอักษรสามตัว
  • dd หมายถึงการแสดงวันของเดือน
  • YYYY หมายถึงการแสดงปีโดยใช้ตัวเลขสี่หลัก

ถ้าเราต้องการส่งออกเดือนเป็นตัวเลขMMMเราต้องเขียน แทน MMซึ่งให้รูป"MM-dd-YYYY"แบบ เอาต์พุตหน้าจอจะเป็น06-04-2005

เราจะหารือเกี่ยวกับชั้นเรียนนี้ในรายละเอียดเพิ่มเติมในภายหลัง


8. Date.parseวิธีการ

ชั้นDateเรียนสามารถทำอย่างอื่นที่น่าสนใจและมีประโยชน์ได้ เช่น รับวันที่จากสตริง หรือตามที่โปรแกรมเมอร์พูด มันสามารถแยกวิเคราะห์สตริงได้

มีparse()วิธีการพิเศษสำหรับสิ่งนี้ การแยกวิเคราะห์มีลักษณะดังนี้:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

อย่างไรก็ตาม โค้ดนี้สามารถเขียนให้กระชับกว่านี้ได้:

Date date = new Date("Jul 06 12:15:00 2019");

เราจะพิจารณาการแยกวิเคราะห์สตริงอย่างละเอียดในบทเรียนอื่นๆ