รูปแบบวันที่ของ Java - รวมถึงอักขระเพิ่มเติม


88

มีการจัดรูปแบบสไตล์ php date () เทียบเท่าใน Java หรือไม่? ฉันหมายความว่าใน php ฉันสามารถแบ็กสแลชหนีอักขระเพื่อให้ได้รับการปฏิบัติอย่างแท้จริง เช่นปปปป \ Y \ E \ a \ rจะกลายเป็น2010 ปี ฉันไม่พบสิ่งที่คล้ายกันใน Java ตัวอย่างทั้งหมดจัดการกับรูปแบบวันที่ในตัวเท่านั้น

โดยเฉพาะอย่างยิ่งผมจัดการกับJCalendarเลือกวันของพวกเขาและdateFormatStringคุณสมบัติ

ฉันต้องการมันเพราะในภาษาของฉันจำเป็นต้องเขียนข้อมูลเพิ่มเติมทุกประเภทในรูปแบบวันที่เช่น d (สำหรับวัน) หลังจากวันส่วนม. (เป็นเวลาหลายปี) หลังจากหลายปีเป็นต้นไป ในกรณีที่แย่ที่สุดฉันสามารถใช้การแทนที่สตริงหรือ regexp ได้ แต่อาจมีวิธีที่ง่ายกว่านี้ ขอบคุณล่วงหน้า!


1
สำหรับใครก็ตามที่อ่านสิ่งนี้ในปี 2019 หรือใหม่กว่าSimpleDateFormatชั้นเรียนที่ใช้ในคำตอบสองสามคำตอบนั้นเป็นเรื่องที่ยุ่งยากและล้าสมัยไปนาน หลีกเลี่ยงมัน. แทนที่จะใช้คำตอบสั้น ๆ โดย Mark Jeronimusสาธิตการใช้java.time ซึ่งเป็นวันที่และเวลาของ Java API ที่ทันสมัย
Ole VV

คำตอบ:


165

แน่นอนว่าด้วยSimpleDateFormatคุณสามารถรวมสตริงตามตัวอักษร:

ภายในสตริงรูปแบบวันที่และเวลาตัวอักษรที่ไม่ได้ใส่เครื่องหมายคำพูดตั้งแต่ 'A' ถึง 'Z' และจาก 'a' ถึง 'z' จะถูกตีความว่าเป็นตัวอักษรรูปแบบที่แสดงส่วนประกอบของสตริงวันที่หรือเวลา สามารถอ้างอิงข้อความได้โดยใช้เครื่องหมายคำพูดเดี่ยว (') เพื่อหลีกเลี่ยงการตีความ "''" หมายถึงเครื่องหมายคำพูดเดียว อักขระอื่น ๆ ทั้งหมดจะไม่ถูกตีความ เพียงแค่คัดลอกลงในสตริงเอาต์พุตระหว่างการจัดรูปแบบหรือจับคู่กับสตริงอินพุตระหว่างการแยกวิเคราะห์

 "hh 'o''clock' a, zzzz"    12 o'clock PM, Pacific Daylight Time

สุดยอดนั่นคือสิ่งที่ฉันต้องการ น่าแปลกที่ฉันไม่พบสิ่งง่ายๆเช่นนี้ในหลาย ๆ ตัวอย่างที่ฉันเรียกดูในเว็บ :) ขอบคุณมาก!
Sejanus

1
ฉันจะหลีกเลี่ยงอักขระเครื่องหมายคำพูดได้อย่างไร ฉันกำลังพยายามทำอะไรบางอย่างกับรูปแบบ mm ' ระบุตัวอย่างเช่น 46 นาทีเช่น 46 '
Sotti

3
46''@Sotti: คนแรกที่หนีที่สอง
Thilo

1
FYI, ลำบากชะมัดเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา
Basil Bourque



6

java.time

มาร์คเจโรนิมัสกล่าวไว้แล้ว ฉันกำลังปรุงมันออกมาอีกเล็กน้อย เพียงใส่ข้อความที่จะพิมพ์ภายในเครื่องหมายคำพูดเดียว

    DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy 'year'");
    System.out.println(LocalDate.of(2010, Month.FEBRUARY, 3).format(yearFormatter));
    System.out.println(Year.of(2010).format(yearFormatter));
    System.out.println(ZonedDateTime.now(ZoneId.of("Europe/Vilnius")).format(yearFormatter));

เอาต์พุตเมื่อทำงานในขณะนี้:

2010 year
2010 year
2019 year

หากคุณใช้ a DateTimeFormatterBuilderและappendPatternวิธีการใช้เครื่องหมายคำพูดเดี่ยวในลักษณะเดียวกัน หรือใช้appendLiteralวิธีการแทนและไม่มีเครื่องหมายคำพูดเดียว

เราจะใส่เครื่องหมายคำพูดเดียวในรูปแบบได้อย่างไร? อัญประกาศเดี่ยวสองคำสร้างหนึ่ง ไม่สำคัญว่าอัญประกาศคู่จะอยู่ในเครื่องหมายคำพูดเดี่ยวหรือไม่:

    DateTimeFormatter formatterWithSingleQuote = DateTimeFormatter.ofPattern("H mm'' ss\"");
    System.out.println(LocalTime.now(ZoneId.of("Europe/London")).format(formatterWithSingleQuote));

10 28 '34 "

    DateTimeFormatter formatterWithSingleQuoteInsideSingleQuotes
            = DateTimeFormatter.ofPattern("hh 'o''clock' a, zzzz", Locale.ENGLISH);
    System.out.println(ZonedDateTime.now(ZoneId.of("America/Los_Angeles"))
            .format(formatterWithSingleQuoteInsideSingleQuotes));

02 นาฬิกาตามเวลาออมแสงแปซิฟิก

รูปแบบทั้งหมดข้างต้นสามารถใช้ในการแยกวิเคราะห์ได้เช่นกัน ตัวอย่างเช่น:

    LocalTime time = LocalTime.parse("16 43' 56\"", formatterWithSingleQuote);
    System.out.println(time);

16:43:56 น

SimpleDateFormatระดับใช้เมื่อคำถามนี้ถูกถามเกือบ 10 ปีที่ผ่านมาเป็นฉาวโฉ่ลำบากและล้าสมัยยาว ขอแนะนำให้คุณใช้ java.time ซึ่งเป็นวันที่และเวลาของ Java API ที่ทันสมัยแทน นั่นคือเหตุผลที่ฉันแสดงให้เห็นเพียงแค่นั้น

ลิงค์


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.