สวัสดี! วันนี้เราจะเริ่มทำงานกับข้อมูลประเภทใหม่ที่เราไม่เคยพบมาก่อน นั่นก็คือ วันที่
ฉันคิดว่าไม่จำเป็นต้องอธิบายว่าวันที่คืออะไร :) โดยหลักการแล้ว ค่อนข้างเป็นไปได้ที่จะเขียนวันที่และเวลาปัจจุบันใน 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()
boolean
before()
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 อย่างที่คุณเห็น วิธีที่เลิกใช้แล้วจะถูกขีดฆ่าออกไป แต่ใช้งานได้ค่อนข้างดี วิธีการเหล่านี้ไม่ได้ถูกลบออกอย่างสมบูรณ์ เพื่อที่จะได้ไม่ทำลายโค้ดจำนวนมากที่เขียนโดยใช้วิธีการเหล่านี้ นั่นคือวิธีการเหล่านี้ไม่ "เสียหาย" หรือ "ถูกลบออก" เพียงแต่ไม่แนะนำให้ใช้เนื่องจากมีทางเลือกที่สะดวกกว่า อย่างไรก็ตาม มีการเขียนเกี่ยวกับเรื่องนี้ไว้ในเอกสารประกอบ: 
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 นี่คือคลาสที่คุณต้องแปลงวันที่เป็นรูปแบบที่คุณกำหนด
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