สวัสดี! วันนี้เราจะเริ่มทำงานกับข้อมูลประเภทใหม่ที่เราไม่เคยพบมาก่อน นั่นก็คือ วันที่
ฉันคิดว่าไม่จำเป็นต้องอธิบายว่าวันที่คืออะไร :) โดยหลักการแล้ว ค่อนข้างเป็นไปได้ที่จะเขียนวันที่และเวลาปัจจุบันใน Java ด้วยสตริงปกติ
วิธีการส่วนใหญ่ของคลาส Date ถูกย้ายไปยังเวอร์ชันขยายที่ปรับปรุงแล้ว -
วันที่เป็นเพียงชุดตัวเลขที่แสดงถึงช่วงเวลาหนึ่งๆ และปฏิทินเป็นอุปกรณ์ทั้งหมดที่คุณสามารถทำสิ่งต่าง ๆ มากมายกับวันที่ :) สิ่งนี้สามารถเห็นได้ค่อนข้างชัดเจนหากคุณพยายามส่งออกวัตถุปฏิทินไปยังคอนโซล: เอาต์พุต:
ในทางกลับกันก็คล้ายกับDateFormat มาก ข้อแตกต่างที่น่าสังเกตเพียงอย่างเดียวระหว่างทั้งสองคือ SimpleDateFormat สามารถใช้สำหรับการจัดรูปแบบ (การแปลงวันที่เป็นสตริง) และแยกวิเคราะห์สตริงให้เป็นวันที่ที่รับรู้สถานที่ ในขณะที่ DateFormat ไม่รองรับสถานที่ นอกจากนี้ DateFormat ยังเป็นคลาสนามธรรมที่ให้การสนับสนุนพื้นฐานสำหรับการจัดรูปแบบและการแยกวิเคราะห์วันที่ ในขณะที่ SimpleDateFormat เป็นคลาสที่เป็นรูปธรรมที่ขยายคลาส DateFormat นี่คือตัวอย่างการสร้างออบเจ็กต์ SimpleDateFormat และการจัดรูปแบบวันที่ดังนี้:
ตัวอย่างการผสมอักขระรูปแบบ:
หากคุณทำผิดพลาดเล็กน้อยกับรูปแบบ คุณสามารถเป็นเจ้าของ java.text.ParseException ได้ และนี่ไม่ใช่ความสำเร็จที่น่าพอใจอย่างยิ่ง การเดินทางสั้น ๆ ในSimpleDateFormatจบลงแล้ว - กลับมาที่การแปลสตริง java จนถึงปัจจุบันกันดีกว่า SimpleDateFormatให้ความสามารถดังกล่าวแก่เรา และเราจะอธิบายกระบวนการนี้ทีละขั้นตอน
public class Main {
public static void main(String[] args) {
String date = "June 11, 2018";
System.out.println(date);
}
} แต่วิธีนี้มีข้อเสียหลายประการ ชั้นเรียนStringถูกสร้างขึ้นเพื่อทำงานกับข้อความและมีวิธีการที่เหมาะสม หากเราจำเป็นต้องจัดการวันที่ด้วยวิธีใดวิธีหนึ่ง (เช่น เพิ่ม 2 ชั่วโมง) มันStringจะไม่ทำงานที่นี่ หรือแสดงวันที่และเวลาปัจจุบัน ณ เวลาที่คอมไพล์โปรแกรมลงในคอนโซล นี่ ก็ไม่ช่วย Stringอะไรเช่นกัน: ในขณะที่คุณเขียนโค้ดและรันมัน เวลาจะเปลี่ยนไปและสิ่งที่ไม่เกี่ยวข้องจะปรากฏในคอนโซล ดังนั้นใน Java ผู้สร้างจึงจัดให้มีคลาสหลายคลาสสำหรับการทำงานกับวันที่และเวลา อันแรกคือคลาสjava.util.Date
คลาสวันที่ Java
เราตั้งชื่อเต็มให้กับมันเพราะมีคลาสอยู่ในแพ็คเกจอื่นใน Javajava.sql.Dateด้วย อย่าสับสน! สิ่งแรกที่คุณต้องรู้คือมันเก็บวันที่ในหน่วยมิลลิวินาทีที่ผ่านไปตั้งแต่วันที่ 1 มกราคม 1970 มีชื่อแยกต่างหากสำหรับวันที่นี้ - "เวลา Unix" เป็นวิธีที่น่าสนใจมากคุณไม่เห็นด้วยเหรอ? :) สิ่งที่สองที่ต้องจำ: หากคุณสร้างวัตถุDateด้วยตัวสร้างที่ว่างเปล่า ผลลัพธ์จะเป็น วันที่และเวลาปัจจุบัน ณ เวลา ที่วัตถุถูกสร้างขึ้น Stringคุณจำได้ไหมว่าเราเขียนว่า งานดังกล่าวจะเป็นปัญหาสำหรับรูปแบบวัน ที่อย่างไร ชั้นเรียนDateแก้ปัญหาได้อย่างง่ายดาย
public class Main {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
}
} รันโค้ดนี้หลายๆ ครั้งแล้วคุณจะเห็นว่าเวลาจะเปลี่ยนไปในแต่ละครั้งอย่างไร :) สิ่งนี้เป็นไปได้อย่างแม่นยำเพราะมันถูกจัดเก็บในหน่วยมิลลิวินาที: มันเป็นหน่วยเวลาที่เล็กที่สุด ซึ่งเป็นเหตุผลว่าทำไมผลลัพธ์จึงแม่นยำมาก มี Constructor อื่นสำหรับDate: คุณสามารถระบุจำนวนมิลลิวินาทีที่แน่นอนที่ผ่านไปตั้งแต่ 00:00 น. ของวันที่ 1 มกราคม 1970 จนถึงวันที่ที่ต้องการ และมันจะถูกสร้างขึ้น:
public class Main {
public static void main(String[] args) {
Date date = new Date(1212121212121L);
System.out.println(date);
}
} เอาต์พุตคอนโซล:
Fri May 30 08:20:12 MSD 2008 เราได้รับมันเมื่อวันที่ 30 พฤษภาคม 2008 “ วันศุกร์” หมายถึงวันในสัปดาห์ - “ วันศุกร์” (วันศุกร์) และ MSD - “ ออมแสงมอสโก” (เวลาฤดูร้อนของมอสโก) มิลลิวินาทีจะถูกส่งในรูปแบบlongเนื่องจากจำนวนส่วนใหญ่มักไม่พอดีintกับ แล้วเราจำเป็นต้องมีการดำเนินการเดทแบบใดในงานของเรา? แน่นอนว่าสิ่งที่ชัดเจนที่สุดคือการเปรียบเทียบ ตรวจสอบว่าวันหนึ่งช้ากว่าหรือเร็วกว่าวันอื่น ซึ่งสามารถทำได้หลายวิธี ตัวอย่างเช่น คุณสามารถเรียกใช้เมธอด . Date.getTime()ซึ่งจะส่งคืนจำนวนมิลลิวินาทีที่ผ่านไปตั้งแต่เที่ยงคืนของวันที่ 1 มกราคม 1970 ลองเรียกมันบนวัตถุ Date สองอันแล้วเปรียบเทียบกัน:
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");
}
} บทสรุป:
date1 раньше date2แต่มีวิธี ที่ สะดวกกว่าคือใช้วิธีพิเศษของคลาสDate: before()และ พวกเขาทั้งหมดส่งคืนผลลัพธ์เป็น. วิธีการตรวจสอบว่าวันที่ของเราเร็วกว่าวันที่เราส่งผ่านเป็นอาร์กิวเมนต์หรือไม่: after()equals()booleanbefore()
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));
}
} เอาต์พุตคอนโซล:
true วิธีการทำงานในลักษณะเดียวกันafter()โดยตรวจสอบว่าวันที่ของเราช้ากว่าวันที่เราส่งผ่านเป็นอาร์กิวเมนต์หรือไม่:
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));
}
}
เอาต์พุตคอนโซล:
false ในตัวอย่างของเรา เรากำหนดให้โปรแกรมเข้าสู่โหมดสลีปเป็นเวลา 2 วินาที เพื่อรับประกันว่าวันที่ทั้งสองจะแตกต่างกัน บนคอมพิวเตอร์ที่รวดเร็ว เวลาระหว่างการสร้างdate1และdate2สามารถน้อยกว่าหนึ่งมิลลิวินาที ซึ่งในกรณีนี้ทั้งและbefore()และafter()จะส่งfalseคืน แต่วิธีการequals()ในสถานการณ์เช่นนี้จะกลับมาtrue! โดยจะเปรียบเทียบจำนวนมิลลิวินาทีที่ผ่านไปนับตั้งแต่เวลา 00:00 น. ของวันที่ 1 มกราคม 1970 ในแต่ละวัน ออบเจ็กต์จะถือว่าเท่ากันก็ต่อเมื่อจับคู่กันในระดับมิลลิวินาที:
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));
} นี่คือสิ่งอื่นที่คุณต้องใส่ใจ หากคุณเปิดเอกสารสำหรับชั้นเรียนDateบนเว็บไซต์ Oracle คุณจะเห็นว่าเมธอดและตัวสร้างจำนวนมากถูกกำหนดเป็นDeprecated(“เลิกใช้แล้ว”) ดูที่นี่: Class Date นี่คือสิ่งที่ผู้สร้าง Java พูดเกี่ยวกับส่วนของคลาสเหล่านั้นที่เลิกใช้แล้ว: “องค์ประกอบของโปรแกรมที่มีคำอธิบายประกอบด้วย @Deprecated เป็นสิ่งที่โปรแกรมเมอร์ท้อแท้จากการใช้ โดยปกติเพราะมันเป็นอันตราย หรือเพราะว่า มีทางเลือกอื่นที่ดีกว่า” นี่ไม่ได้หมายความว่าวิธีการเหล่านี้ไม่สามารถใช้งานได้เลย ยิ่งกว่านั้น หากคุณพยายามเรียกใช้โค้ดโดยใช้โค้ดเหล่านั้นใน IDEA ก็มีแนวโน้มว่าจะได้ผล ลองใช้ตัวอย่าง method ที่เลิกใช้แล้วซึ่ง Date.getHours()ส่งคืนจำนวนชั่วโมงจาก objectDate
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1.getHours());
} หาก ณ เวลาที่คุณรันโค้ด เช่น เวลาคือ 14:21 ก็จะแสดงหมายเลข 14 อย่างที่คุณเห็น วิธีที่เลิกใช้แล้วจะถูกขีดฆ่าออกไป แต่ใช้งานได้ค่อนข้างดี วิธีการเหล่านี้ไม่ได้ถูกลบออกอย่างสมบูรณ์ เพื่อที่จะได้ไม่ทำลายโค้ดจำนวนมากที่เขียนโดยใช้วิธีการเหล่านี้ นั่นคือวิธีการเหล่านี้ไม่ "เสียหาย" หรือ "ถูกลบออก" เพียงแต่ไม่แนะนำให้ใช้เนื่องจากมีทางเลือกที่สะดวกกว่า อย่างไรก็ตาม มีการเขียนเกี่ยวกับเรื่องนี้ไว้ในเอกสารประกอบ:
วิธีการส่วนใหญ่ของคลาส Date ถูกย้ายไปยังเวอร์ชันขยายที่ปรับปรุงแล้ว - Calendarคลาส เราจะได้รู้จักเขามากขึ้น :)
ปฏิทินชวา
Java 1.1 เปิดตัวคลาสใหม่ -Calendar. เขาทำให้การทำงานกับเดทใน Java ง่ายขึ้นกว่าเดิมเล็กน้อย การใช้งานคลาสเดียวCalendarที่เราจะใช้คือคลาสGregorianCalendar(ใช้ปฏิทินเกรโกเรียนตามที่ประเทศส่วนใหญ่ในโลกอาศัยอยู่) ความสะดวกหลักคือสามารถทำงานกับวันที่ในรูปแบบที่สะดวกยิ่งขึ้นได้ ตัวอย่างเช่น เขาสามารถ:
- เพิ่มเดือนหรือวันให้กับวันที่ปัจจุบัน
- ตรวจสอบว่าปีนั้นเป็นปีอธิกสุรทินหรือไม่
- รับองค์ประกอบวันที่แต่ละรายการ (เช่น รับหมายเลขเดือนจากวันที่ทั้งหมด)
- และยังได้มีการพัฒนาระบบค่าคงที่ที่สะดวกมากภายในนั้น (เราจะดูหลายระบบด้านล่าง)
Calendarคือใช้ค่าคงที่Calendar.Era: คุณสามารถกำหนดวันที่ให้เป็นยุค ก่อน คริสต์ศักราช (“ ก่อนคริสต์ศักราช” - ก่อนการประสูติของพระคริสต์เช่น“ ก่อนยุคของเรา”) หรือAC (“ หลังพระคริสต์” - “ ยุคของเรา") ลองดูทั้งหมดนี้พร้อมตัวอย่าง มาสร้างปฏิทินด้วยวันที่ 25 มกราคม 2017:
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar(2017, 0 , 25);
} เดือนในชั้นเรียนCalendar(เช่น ในDate) เริ่มจากศูนย์ ดังนั้นเราจึงส่งหมายเลข 0 เป็นอาร์กิวเมนต์ที่สอง สิ่งสำคัญเมื่อทำงานกับชั้นเรียนCalendarคือการเข้าใจว่านี่คือปฏิทินไม่ใช่วันที่แยกต่างหาก
วันที่เป็นเพียงชุดตัวเลขที่แสดงถึงช่วงเวลาหนึ่งๆ และปฏิทินเป็นอุปกรณ์ทั้งหมดที่คุณสามารถทำสิ่งต่าง ๆ มากมายกับวันที่ :) สิ่งนี้สามารถเห็นได้ค่อนข้างชัดเจนหากคุณพยายามส่งออกวัตถุปฏิทินไปยังคอนโซล: เอาต์พุต:
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=?] มีข้อมูลมากแค่ไหนมาดูกัน! ปฏิทินมีคุณสมบัติมากมายที่ไม่มีวันปกติ และคุณสมบัติทั้งหมดจะถูกส่งออกไปยังคอนโซล (นี่คือวิธี การทำงาน toString()ของชั้นเรียนCalendar) หากเมื่อทำงานคุณเพียงแค่ต้องได้รับวันที่ธรรมดาจากปฏิทินเช่น วัตถุDate- ทำได้โดยใช้วิธีการCalendar.getTime()(ชื่อไม่สมเหตุสมผลที่สุด แต่ไม่มีอะไรสามารถทำได้):
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar(2017, 0 , 25);
Date date = calendar.getTime();
System.out.println(date);
} บทสรุป:
Wed Jan 25 00:00:00 MSK 2017 ตอนนี้เราได้ "ทำให้ปฏิทิน" เป็นวันที่ปกติแล้ว เดินหน้าต่อไป นอกจากสัญลักษณ์ตัวเลขของเดือนแล้วCalendarยังสามารถใช้ค่าคงที่ในห้องเรียนได้อีกด้วย ค่าคงที่คือฟิลด์คงที่ของคลาสCalendarที่มีค่าที่ตั้งไว้แล้วซึ่งไม่สามารถเปลี่ยนแปลงได้ ตัวเลือกนี้ดีกว่าจริง ๆ เนื่องจากช่วยเพิ่มความสามารถในการอ่านโค้ด
public static void main(String[] args) {
GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}Calendar.JANUARY— หนึ่งในค่าคงที่สำหรับระบุเดือน ด้วยตัวเลือกการตั้งชื่อนี้ จะไม่มีใครลืม เช่น ตัวเลข "3" หมายถึงเดือนเมษายน ไม่ใช่เดือนที่สามที่เราคุ้นเคย - มีนาคม คุณเพียงแค่เขียน - เท่านี้ก็เรียบร้อย :) คุณสามารถตั้งค่าฟิลด์ปฏิทินทั้งหมด (วัน, เดือนCalendar.APRIL, นาที, วินาที ฯลฯ ) แยกกันได้โดยใช้วิธีการ set()สะดวกมาก เนื่องจากCalendarแต่ละฟิลด์มีค่าคงที่ของตัวเองในคลาส และโค้ดสุดท้ายจะดูง่ายที่สุด ตัวอย่างเช่น ในตัวอย่างก่อนหน้านี้ เราสร้างวันที่ แต่ไม่ได้ตั้งเวลาปัจจุบัน ตั้งเวลาเป็น 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());
} บทสรุป:
Wed Jan 25 19:42:12 MSK 2017 เราเรียกเมธอดset()โดยส่งค่าคงที่ไปให้ (ขึ้นอยู่กับฟิลด์ที่เราต้องการเปลี่ยน) และค่าใหม่สำหรับฟิลด์นี้ ปรากฎว่าวิธีการนี้set()เป็น "super-setter" ชนิดหนึ่งที่สามารถตั้งค่าได้ไม่ใช่สำหรับฟิลด์เดียว แต่สำหรับหลาย ๆ ฟิลด์ :) การเพิ่มและการลบค่าในคลาสCalendarจะดำเนินการโดยใช้คำสั่งadd(). คุณต้องส่งผ่านฟิลด์ที่คุณต้องการเปลี่ยนแปลงและตัวเลข - จำนวนที่คุณต้องการบวก / ลบจากค่าปัจจุบัน ตัวอย่างเช่น ลองตั้งวันที่ที่เราสร้างย้อนกลับไปเมื่อ 2 เดือนที่แล้ว:
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());
} บทสรุป:
Fri Nov 25 19:42:12 MSK 2016 ยอดเยี่ยม! เรากำหนดวันที่กลับไปเมื่อ 2 เดือนที่แล้ว เป็นผลให้ไม่เพียงแต่เดือนเท่านั้น แต่ยังรวมถึงปีด้วยตั้งแต่ 2017 ถึง 2016 แน่นอนว่าการคำนวณปีปัจจุบันเมื่อย้ายวันที่จะดำเนินการโดยอัตโนมัติและไม่จำเป็นต้องควบคุมด้วยตนเอง แต่หากคุณจำเป็นต้องปิดการใช้งานพฤติกรรมนี้เพื่อจุดประสงค์บางอย่าง คุณก็สามารถทำได้ วิธีพิเศษroll()สามารถเพิ่มและลบค่าได้โดยไม่กระทบต่อค่าอื่นๆ ตัวอย่างเช่นเช่นนี้:
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());
} เราทำแบบเดียวกับตัวอย่างก่อนหน้าทุกประการ - ลบ 2 เดือนจากวันที่ปัจจุบัน แต่ตอนนี้โค้ดทำงานแตกต่างออกไป: เดือนเปลี่ยนจากเดือนมกราคมเป็นพฤศจิกายน แต่ปียังคงเหมือนเดิมกับปี 2017! บทสรุป:
Sat Nov 25 10:42:12 MSK 2017 ไกลออกไป. ดังที่เราได้กล่าวไว้ข้างต้น ฟิลด์ทั้งหมดของออบเจ็กต์Calendarสามารถรับแยกกันได้ วิธีการนี้มีหน้าที่รับผิดชอบในเรื่องนี้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));
} บทสรุป:
Год: 2017
Месяц: 0
Порядковый номер недели в месяце: 4
Число: 25
Часы: 10
Минуты: 42
Секунды: 12
Миллисекунды: 0 นั่นคือนอกเหนือจาก "super-setter" ในชั้นเรียนแล้วCalendarยังมี "super-getter" ด้วย :) อีกประเด็นที่น่าสนใจคือแน่นอนว่าการทำงานกับยุคต่างๆ ในการสร้างวันที่ "BC" คุณต้องใช้ฟิลด์Calendar.Era ตัวอย่างเช่น เรามาสร้างวันที่ที่ระบุ Battle of Cannae ซึ่ง Hannibal เอาชนะกองทัพแห่งกรุงโรม เรื่องนี้เกิดขึ้นเมื่อวันที่ 2 สิงหาคม 216 ปีก่อนคริสตกาล จ.:
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()));
} ที่นี่เราใช้คลาสSimpleDateFormatเพื่อแสดงวันที่ในรูปแบบที่เราเข้าใจได้มากขึ้น (ตัวอักษร “GG” มีหน้าที่แสดงยุคสมัย) บทสรุป:
02 авг 216 до н.э.Calendarมีวิธีการและค่าคงที่อีกมากมาย ใน class อ่านรายละเอียดได้ในเอกสารประกอบ:
ขึ้นบรรทัดใหม่ถึงวันที่
หากต้องการแปลง String เป็น Date คุณสามารถใช้คลาสตัวช่วย Java - SimpleDateFormat นี่คือคลาสที่คุณต้องแปลงวันที่เป็นรูปแบบที่คุณกำหนด
ในทางกลับกันก็คล้ายกับDateFormat มาก ข้อแตกต่างที่น่าสังเกตเพียงอย่างเดียวระหว่างทั้งสองคือ SimpleDateFormat สามารถใช้สำหรับการจัดรูปแบบ (การแปลงวันที่เป็นสตริง) และแยกวิเคราะห์สตริงให้เป็นวันที่ที่รับรู้สถานที่ ในขณะที่ DateFormat ไม่รองรับสถานที่ นอกจากนี้ DateFormat ยังเป็นคลาสนามธรรมที่ให้การสนับสนุนพื้นฐานสำหรับการจัดรูปแบบและการแยกวิเคราะห์วันที่ ในขณะที่ SimpleDateFormat เป็นคลาสที่เป็นรูปธรรมที่ขยายคลาส DateFormat นี่คือตัวอย่างการสร้างออบเจ็กต์ SimpleDateFormat และการจัดรูปแบบวันที่ดังนี้:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);
System.out.println(formatter.format(date)); ในตัวอย่างข้างต้น เราใช้รูปแบบ "yyyy-MM-dd HH:mm:ss" ซึ่งหมายถึง:
- 4 หลักสำหรับปี (ปปปป)
- 2 หลักต่อเดือน (MM)
- 2 หลักสำหรับวัน (dd);
- 2 หลักสำหรับชั่วโมงในรูปแบบ 24 ชั่วโมง (HH)
- 2 หลักสำหรับนาที (มม.)
- 2 หลักสำหรับวินาที (ss)
2008-05-30 08:20:12มีตัวอักษรเทมเพลตจำนวน มาก สำหรับ คลาส SimpleDateFormat เพื่อไม่ให้คุณสับสนเราได้รวบรวมไว้ในตาราง:
| เครื่องหมาย | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| ช | ยุค (ในการแปลภาษาอังกฤษ - AD และ BC) | ค.ศ |
| ย | ปี (ตัวเลข 4 หลัก) | 2020 |
| ใช่ | ปี (เลขท้าย 2 หลัก) | 20 |
| เย้ | ปี (ตัวเลข 4 หลัก) | 2020 |
| ม | เลขที่เดือน (ไม่มีศูนย์นำหน้า) | 8 |
| มม | หมายเลขเดือน (มีศูนย์นำหน้าหากหมายเลขเดือน < 10) | 04 |
| อืม | ตัวย่อเดือนสามตัวอักษร (ตามการแปล) | ม.ค |
| อืมมม | ชื่อเดือนเต็ม | มิถุนายน |
| ว | สัปดาห์ของปี (ไม่มีศูนย์นำหน้า) | 4 |
| www | สัปดาห์ของปี (มีศูนย์นำหน้า) | 04 |
| ว | สัปดาห์ในเดือน (ไม่มีศูนย์นำหน้า) | 3 |
| วว | สัปดาห์ในเดือน (มีศูนย์นำหน้า) | 03 |
| ดี | วันของปี | 67 |
| ง | วันของเดือน (ไม่มีศูนย์นำหน้า) | 9 |
| วว | วันของเดือน (มีศูนย์นำหน้า) | 09 |
| เอฟ | วันในสัปดาห์ในเดือนนั้น (ไม่มีศูนย์นำหน้า) | 9 |
| เอฟเอฟ | วันในสัปดาห์ในเดือน (มีศูนย์นำหน้า) | 09 |
| อี | วันในสัปดาห์ (ตัวย่อ) | ว |
| อี๊ | วันในสัปดาห์ (เต็ม) | วันศุกร์ |
| ยู | ตัวเลขวันในสัปดาห์ (ไม่มีศูนย์นำหน้า) | 5 |
| คุณ | จำนวนวันในสัปดาห์ (มีศูนย์นำหน้า) | 05 |
| ก | เครื่องหมาย AM/PM | เช้า. |
| ชม | ชั่วโมงในรูปแบบ 24 ชั่วโมงโดยไม่มีศูนย์นำหน้า | 6 |
| ฮฮ | นาฬิกาในรูปแบบ 24 ชั่วโมง โดยมีศูนย์นำหน้า | 06 |
| เค | จำนวนชั่วโมงในรูปแบบ 24 ชั่วโมง | 18 |
| เค | จำนวนชั่วโมงในรูปแบบ 12 ชั่วโมง | 6 |
| ชม. | เวลาในรูปแบบ 12 ชั่วโมงโดยไม่มีศูนย์นำหน้า | 6 |
| ฮะ | เวลาในรูปแบบ 12 ชั่วโมง โดยมีศูนย์นำหน้า | 06 |
| ม | นาทีโดยไม่มีศูนย์นำหน้า | 32 |
| มม | นาทีโดยมีศูนย์นำหน้า | 32 |
| ส | วินาทีโดยไม่มีศูนย์นำหน้า | สิบเอ็ด |
| เอสเอส | วินาทีโดยมีศูนย์นำหน้า | สิบเอ็ด |
| ส | มิลลิวินาที | 297 |
| z | เขตเวลา | อีอีที |
| ซี | เขตเวลาในรูปแบบ RFC 822 | 300 |
| ตัวอย่าง | ตัวอย่าง |
|---|---|
| วว-ดด-ปปปป | 01-11-2020 |
| ปปปป-MM-dd | 2019-10-01 |
| HH:mm:ss.SSS | 23:59.59.999 |
| ปปปป-ดด-วว HH:mm:ss | 30-11-2018 03:09:02 |
| ปปปป-ดด-วว HH:mm:ss.SSS | 01-03-2016 01:20:47.999 |
| ปปปป-ดด-วว HH:mm:ss.SSS Z | 13-13-2556 23:59:59.999 +0100 |
-
สร้างบรรทัดที่คุณต้องการตั้งวันที่:
String strDate = "Sat, April 4, 2020"; -
เราสร้าง ออบเจ็กต์SimpleDateFormat ใหม่ ด้วยเทมเพลตที่ตรงกับสิ่งที่เรามีในสตริง (ไม่เช่นนั้นเราจะไม่สามารถแยกวิเคราะห์ได้):
SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);อย่างที่คุณเห็น เรามีอาร์กิวเมนต์ Locale ที่นี่ หากเราไม่ระบุ ระบบจะใช้ Locale เริ่มต้นซึ่งไม่ใช่ภาษาอังกฤษเสมอไป
หากโลแคลไม่ตรงกับสตริงอินพุต ข้อมูลสตริงที่เชื่อมโยงกับภาษา เช่นจันทร์หรือเมษายน ของเรา จะไม่ได้รับการยอมรับ และจะส่ง java.text.ParseException แม้ว่ารูปแบบจะตรงกันก็ตาม
อย่างไรก็ตาม เราไม่จำเป็นต้องระบุรูปแบบหากเราใช้เทมเพลตที่ไม่เฉพาะภาษา ตามตัวอย่าง - yyyy-MM-dd HH:mm:ss
-
เราสร้างวันที่โดยใช้ฟอร์แมตเตอร์ ซึ่งจะแยกวิเคราะห์จากสตริงอินพุต:
try { Date date = formatter.parse(strDate); System.out.println(date); } catch (ParseException e) { e.printStackTrace(); }เอาต์พุตคอนโซล:
Sat Apr 04 00:00:00 EEST 2020อืม... แต่รูปแบบไม่เหมือนเดิมอีกต่อไป!
ในการสร้างรูปแบบเดียวกัน เราใช้ฟอร์แมตเตอร์อีกครั้ง:
System.out.println(formatter.format(date));เอาต์พุตคอนโซล:
Sat, April 4, 2020
SimpleDateFormat และปฏิทิน
SimpleDateFormat ช่วยให้คุณสามารถจัดรูปแบบวัตถุวันที่และปฏิทินทั้งหมดที่คุณสร้างเพื่อใช้ในภายหลัง ลองพิจารณาจุดที่น่าสนใจเช่นการทำงานกับยุคสมัย หากต้องการสร้างวันที่ "BC" คุณต้องใช้ช่อง Calendar.Era ตัวอย่างเช่น เรามาสร้างวันที่ที่ระบุ Battle of Cannae ซึ่ง Hannibal เอาชนะกองทัพแห่งกรุงโรม เรื่องนี้เกิดขึ้นเมื่อวันที่ 2 สิงหาคม 216 ปีก่อนคริสตกาล จ.: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()));
} ที่นี่เราใช้คลาส SimpleDateFormat เพื่อแสดงวันที่ในรูปแบบที่เราเข้าใจได้มากขึ้น (ตามที่ระบุไว้ข้างต้น ตัวอักษร "GG" มีหน้าที่ในการแสดงยุค) บทสรุป:
02 авг 216 до н.э.
รูปแบบวันที่ของ Java
นี่เป็นอีกกรณีหนึ่ง สมมติว่ารูปแบบวันที่นี้ไม่เหมาะกับเรา:
Sat Nov 25 10:42:12 MSK 2017 ดังนั้นนี่คือ การใช้ความสามารถของเราในรูปแบบวันที่ Java คุณสามารถเปลี่ยนเป็นของคุณเองได้โดยไม่ยาก:
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()));
} บทสรุป:
суббота, 25 Ноябрь 2017 ดีขึ้นมากใช่ไหม? :)
GO TO FULL VERSION