JavaRush /จาวาบล็อก /Random-TH /วิธีที่จะไม่หลงทางตามเวลา - DateTime และ Calendar

วิธีที่จะไม่หลงทางตามเวลา - DateTime และ Calendar

เผยแพร่ในกลุ่ม
สวัสดี! วันนี้เราจะเริ่มทำงานกับข้อมูลประเภทใหม่ที่เราไม่เคยพบมาก่อน นั่นก็คือ วันที่ วิธีที่จะไม่หลงทางตามเวลา - วันที่และเวลาและปฏิทิน - 1ฉันคิดว่าไม่จำเป็นต้องอธิบายว่าวันที่คืออะไร :) โดยหลักการแล้ว ค่อนข้างเป็นไปได้ที่จะเขียนวันที่และเวลาปัจจุบันใน Java ด้วยสตริงปกติ
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

เราตั้งชื่อเต็มให้กับมันเพราะมีคลาสอยู่ในแพ็คเกจอื่นใน Java java.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 อย่างที่คุณเห็น วิธีที่เลิกใช้แล้วจะถูกขีดฆ่าออกไป แต่ใช้งานได้ค่อนข้างดี วิธีการเหล่านี้ไม่ได้ถูกลบออกอย่างสมบูรณ์ เพื่อที่จะได้ไม่ทำลายโค้ดจำนวนมากที่เขียนโดยใช้วิธีการเหล่านี้ นั่นคือวิธีการเหล่านี้ไม่ "เสียหาย" หรือ "ถูกลบออก" เพียงแต่ไม่แนะนำให้ใช้เนื่องจากมีทางเลือกที่สะดวกกว่า อย่างไรก็ตาม มีการเขียนเกี่ยวกับเรื่องนี้ไว้ในเอกสารประกอบ: วิธีที่จะไม่หลงทางตามเวลา - วันที่และเวลาและปฏิทิน - 2วิธีการส่วนใหญ่ของคลาส 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คือการเข้าใจว่านี่คือปฏิทินไม่ใช่วันที่แยกต่างหาก วิธีที่จะไม่หลงทางตามเวลา - DateTime และ Calendar - 3วันที่เป็นเพียงชุดตัวเลขที่แสดงถึงช่วงเวลาหนึ่งๆ และปฏิทินเป็นอุปกรณ์ทั้งหมดที่คุณสามารถทำสิ่งต่าง ๆ มากมายกับวันที่ :) สิ่งนี้สามารถเห็นได้ค่อนข้างชัดเจนหากคุณพยายามส่งออกวัตถุปฏิทินไปยังคอนโซล: เอาต์พุต:

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 นี่คือคลาสที่คุณต้องแปลงวันที่เป็นรูปแบบที่คุณกำหนด วิธีที่จะไม่หลงทางตามเวลา - วันที่และเวลาและปฏิทิน - 5ในทางกลับกันก็คล้ายกับ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
หากคุณทำผิดพลาดเล็กน้อยกับรูปแบบ คุณสามารถเป็นเจ้าของ java.text.ParseException ได้ และนี่ไม่ใช่ความสำเร็จที่น่าพอใจอย่างยิ่ง การเดินทางสั้น ๆ ในSimpleDateFormatจบลงแล้ว - กลับมาที่การแปลสตริง java จนถึงปัจจุบันกันดีกว่า SimpleDateFormatให้ความสามารถดังกล่าวแก่เรา และเราจะอธิบายกระบวนการนี้ทีละขั้นตอน
  1. สร้างบรรทัดที่คุณต้องการตั้งวันที่:

    String strDate = "Sat, April 4, 2020";
  2. เราสร้าง ออบเจ็กต์SimpleDateFormat ใหม่ ด้วยเทมเพลตที่ตรงกับสิ่งที่เรามีในสตริง (ไม่เช่นนั้นเราจะไม่สามารถแยกวิเคราะห์ได้):

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

    อย่างที่คุณเห็น เรามีอาร์กิวเมนต์ Locale ที่นี่ หากเราไม่ระบุ ระบบจะใช้ Locale เริ่มต้นซึ่งไม่ใช่ภาษาอังกฤษเสมอไป

    หากโลแคลไม่ตรงกับสตริงอินพุต ข้อมูลสตริงที่เชื่อมโยงกับภาษา เช่นจันทร์หรือเมษายน ของเรา จะไม่ได้รับการยอมรับ และจะส่ง java.text.ParseException แม้ว่ารูปแบบจะตรงกันก็ตาม

    อย่างไรก็ตาม เราไม่จำเป็นต้องระบุรูปแบบหากเราใช้เทมเพลตที่ไม่เฉพาะภาษา ตามตัวอย่าง - yyyy-MM-dd HH:mm:ss

  3. เราสร้างวันที่โดยใช้ฟอร์แมตเตอร์ ซึ่งจะแยกวิเคราะห์จากสตริงอินพุต:

    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
ดีขึ้นมากใช่ไหม? :)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION