การแปลงสตริง Java เป็นวันที่


886

วิธีที่ดีที่สุดในการแปลงStringรูปแบบ '2 มกราคม 2010' เป็น a Dateใน Java คืออะไร?

ท้ายที่สุดฉันต้องการแยกเดือน, วัน, และปีเป็นจำนวนเต็มเพื่อที่ฉันจะได้ใช้

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

เพื่อแปลงวันที่เป็นเวลา


15
โปรดทราบว่าคำตอบจำนวนมากไม่สนใจรายละเอียดปลีกย่อยเช่นภาษาและเขตเวลา ฉันขอแนะนำให้อ่านเอกสารอย่างละเอียดสำหรับคลาส Date, TimeZone, Locale และ SimpleDateFormat ก่อนใช้งาน
Kristopher Johnson

2
ซ้ำซ้อนของConvert String เป็น java.util.Date
Ankur

7
Java 8 จัดเตรียม Date / Time API ใหม่ หากคุณกำลังใช้งาน Java 8 (หรือใหม่กว่า) คุณควรดูคำตอบนี้: stackoverflow.com/a/22180505/1115554
micha

2
setters ทั้งหมดของDateถูกคัดค้าน
Raedwald

5
FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleTextFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียน ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


1641

นั่นเป็นวิธีที่ยากและjava.util.Dateวิธี setter เหล่านั้นเลิกใช้แล้วตั้งแต่ Java 1.1 (1997) เพียงแค่รูปแบบวันที่ใช้SimpleDateFormatโดยใช้รูปแบบรูปแบบที่ตรงกับสายป้อน

ในกรณีที่คุณระบุว่า "2 มกราคม 2010" เป็นสตริงอินพุต:

  1. "มกราคม" เป็นเดือนข้อความแบบเต็มดังนั้นใช้MMMMรูปแบบของมัน
  2. "2" เป็นวันสั้น ๆ ของเดือนดังนั้นใช้dรูปแบบของมัน
  3. "2010" เป็นปี 4 หลักดังนั้นใช้yyyyรูปแบบของมัน

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

สังเกตความสำคัญของLocaleอาร์กิวเมนต์ที่ชัดเจน หากคุณไม่ใช้งานระบบจะใช้ภาษาเริ่มต้นซึ่งไม่จำเป็นต้องเป็นภาษาอังกฤษตามที่ใช้ในชื่อเดือนของสตริงป้อนข้อมูล หากสถานที่ไม่ตรงกับสายป้อนแล้วคุณจะได้รับความสับสนjava.text.ParseExceptionแม้ว่ารูปแบบรูปแบบที่ถูกต้อง

นี่เป็นส่วนหนึ่งของความเกี่ยวข้องจากjavadocซึ่งแสดงรายการรูปแบบที่มีอยู่ทั้งหมด:

Letter  Date or Time Component  Presentation        Examples
------  ----------------------  ------------------  -------------------------------------
G       Era designator          Text                AD
y       Year                    Year                1996; 96
Y       Week year               Year                2009; 09
M/L     Month in year           Month               July; Jul; 07
w       Week in year            Number              27
W       Week in month           Number              2
D       Day in year             Number              189
d       Day in month            Number              10
F       Day of week in month    Number              2
E       Day in week             Text                Tuesday; Tue
u       Day number of week      Number              1
a       Am/pm marker            Text                PM
H       Hour in day (0-23)      Number              0
k       Hour in day (1-24)      Number              24
K       Hour in am/pm (0-11)    Number              0
h       Hour in am/pm (1-12)    Number              12
m       Minute in hour          Number              30
s       Second in minute        Number              55
S       Millisecond             Number              978
z       Time zone               General time zone   Pacific Standard Time; PST; GMT-08:00
Z       Time zone               RFC 822 time zone   -0800
X       Time zone               ISO 8601 time zone  -08; -0800; -08:00

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

นี่คือตัวอย่างของSimpleDateFormatรูปแบบที่ถูกต้องในการแยกสตริงที่กำหนดวันที่:

Input string                            Pattern
------------------------------------    ----------------------------
2001.07.04 AD at 12:08:56 PDT           yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01                         EEE, MMM d, ''yy
12:08 PM                                h:mm a
12 o'clock PM, Pacific Daylight Time    hh 'o''clock' a, zzzz
0:08 PM, PDT                            K:mm a, z
02001.July.04 AD 12:08 PM               yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700          EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700                       yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700            yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00           yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3                              YYYY-'W'ww-u

หมายเหตุสำคัญSimpleDateFormatคือไม่ปลอดภัยเธรด กล่าวอีกนัยหนึ่งคุณไม่ควรประกาศและกำหนดให้เป็นตัวแปรแบบสแตติกหรืออินสแตนซ์จากนั้นนำกลับมาใช้ใหม่จากวิธีการ / เธรดที่แตกต่างกัน คุณควรสร้างมันใหม่เสมอภายในขอบเขตของวิธีการภายใน


อัปเดต Java 8

หากคุณเกิดขึ้นกับ Java 8 หรือใหม่กว่านั้นให้ใช้DateTimeFormatter(เช่นที่นี่คลิกลิงก์เพื่อดูฟอร์แมตฟอร์แมตที่กำหนดไว้ล่วงหน้าทั้งหมดและรูปแบบการจัดรูปแบบที่มีอยู่การกวดวิชามีให้ที่นี่ ) นี้ API ใหม่ที่มีแรงบันดาลใจจากJodaTime

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

หมายเหตุ: ถ้ารูปแบบรูปแบบของคุณที่เกิดขึ้นเพื่อให้มีเวลาส่วนหนึ่งเช่นกันจากนั้นใช้แทนLocalDateTime#parse(text, formatter) LocalDate#parse(text, formatter)และหากรูปแบบการจัดรูปแบบของคุณมีเขตเวลาด้วยให้ใช้ZonedDateTime#parse(text, formatter)แทน

นี่เป็นส่วนหนึ่งของความเกี่ยวข้องจากjavadocซึ่งแสดงรายการรูปแบบที่มีอยู่ทั้งหมด:

Symbol  Meaning                     Presentation  Examples
------  --------------------------  ------------  ----------------------------------------------
G       era                         text          AD; Anno Domini; A
u       year                        year          2004; 04
y       year-of-era                 year          2004; 04
D       day-of-year                 number        189
M/L     month-of-year               number/text   7; 07; Jul; July; J
d       day-of-month                number        10

Q/q     quarter-of-year             number/text   3; 03; Q3; 3rd quarter
Y       week-based-year             year          1996; 96
w       week-of-week-based-year     number        27
W       week-of-month               number        4
E       day-of-week                 text          Tue; Tuesday; T
e/c     localized day-of-week       number/text   2; 02; Tue; Tuesday; T
F       week-of-month               number        3

a       am-pm-of-day                text          PM
h       clock-hour-of-am-pm (1-12)  number        12
K       hour-of-am-pm (0-11)        number        0
k       clock-hour-of-am-pm (1-24)  number        0

H       hour-of-day (0-23)          number        0
m       minute-of-hour              number        30
s       second-of-minute            number        55
S       fraction-of-second          fraction      978
A       milli-of-day                number        1234
n       nano-of-second              number        987654321
N       nano-of-day                 number        1234000000

V       time-zone ID                zone-id       America/Los_Angeles; Z; -08:30
z       time-zone name              zone-name     Pacific Standard Time; PST
O       localized zone-offset       offset-O      GMT+8; GMT+08:00; UTC-08:00;
X       zone-offset 'Z' for zero    offset-X      Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x      +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z      +0000; -0800; -08:00;

โปรดทราบว่ามันมีตัวฟอร์แมตที่กำหนดไว้ล่วงหน้าหลายตัวสำหรับรูปแบบที่ได้รับความนิยมมากขึ้น ดังนั้นแทนที่จะเช่นคุณสามารถใช้DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); DateTimeFormatter.RFC_1123_DATE_TIMEสิ่งนี้เป็นไปได้เพราะตรงกันข้ามกับSimpleDateFormatเธรดที่ปลอดภัย คุณสามารถกำหนดของคุณเองได้หากจำเป็น

สำหรับรูปแบบสตริงอินพุตเฉพาะคุณไม่จำเป็นต้องใช้อย่างชัดเจนDateTimeFormatter: วันที่ISO 8601 มาตรฐานเช่น 2016-09-26T17: 44: 57Z สามารถแยกวิเคราะห์ได้โดยตรงด้วยLocalDateTime#parse(text)เนื่องจากมันใช้ISO_LOCAL_DATE_TIMEฟอร์แมตเตอร์อยู่แล้ว ในทำนองเดียวกันLocalDate#parse(text)แยกวิเคราะห์วันที่ ISO โดยไม่มีองค์ประกอบเวลา (ดูISO_LOCAL_DATE) และZonedDateTime#parse(text)แยกวิเคราะห์วันที่ ISO ด้วยการเพิ่มออฟเซ็ตและเขตเวลา (ดูISO_ZONED_DATE_TIME)


สวัสดีในตัวเลือกOวิธีการที่จะปล่อยให้มันพิมพ์แทนUTC+08:00 GMT+08:00ฉันไม่ได้รับตัวอย่างใด ๆ
theGamblerRises

มีหลายวิธีที่จะแยกวันที่จะเป็นที่นี่กรณีการใช้งานต่างๆของ DateFormat.parse
drorw

สวัสดี BalusC ฉันมีสตริง20-JUN-16 12.00.00.000000000 AMต้องการความช่วยเหลือในการแปลงเป็นวันที่ ความช่วยเหลือของคุณได้รับการชื่นชมมาก !!
mannedear

@mantear โอ้ขอโทษ .. นั่นเป็นความผิดพลาดของฉัน อย่างไรก็ตามฉันได้รับคำตอบคุณสามารถดูได้ที่นี่: stackoverflow.com/questions/50982310/…
Queendevelopers

74

อ่าใช่การอภิปรายวันที่ของ Java อีกครั้ง เพื่อจัดการกับการจัดการวันที่เราใช้วันที่ , ปฏิทิน , GregorianCalendarและSimpleDateFormat ตัวอย่างเช่นการใช้วันที่เดือนมกราคมของคุณเป็นอินพุต:

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

จากนั้นคุณสามารถจัดการกับสิ่งที่ชอบ:

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

17
อย่าลืมว่าเดือนมกราคมคือหมายเลขเดือน ... 0
Nicolas Zozol

50
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);

13
วัตถุประสงค์ของการแยกการประกาศและคำจำกัดความคืออะไร (แม้ว่าจะไม่ได้ทำกับตัวแปรแรก)
ปีเตอร์มอร์เทนเซ่น

43

ด้วย Java 8 เราจะได้รับ Date / Time API ใหม่ ( JSR 310 )

วิธีต่อไปนี้สามารถใช้เพื่อแยกวิเคราะห์วันที่ใน Java 8 โดยไม่ต้องพึ่งพาJoda-Time :

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDateเป็นคลาส Java 8 มาตรฐานสำหรับการแสดงวันที่ (ไม่มีเวลา) หากคุณต้องการที่จะแยกค่าที่มีวันที่และเวลาที่คุณควรใช้LocalDateTime สำหรับค่าใช้กับเขตZonedDateTime ทั้งสองมีparse()วิธีการคล้ายกับLocalDate:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

รายการการจัดรูปแบบอักขระจากDateTimeFormatter Javadoc :

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

เศษส่วนของเศษเสี้ยวของวินาทีทำงานอย่างไร ถ้าฉันใช้ LocalDateTime date = LocalDateTime.parse ("20140920111713000", รูปแบบ DateTimeFormatter.of‌ ("yyyyMMddHHm‌ mssSSS")); มันล้มเหลว แต่ถ้าฉันใช้ LocalDateTime date = LocalDateTime.parse ("20140920111713.000", DateTimeFormatter.o‌ fPattern ("yyyyMMddHH‌ mmss.SSS")); มันได้ผล
reos

27

แม้ว่าคำตอบบางข้อจะถูกต้องทางเทคนิค แต่ก็ไม่แนะนำให้เลือก

  • คลาส java.util.Date & Calendar มีปัญหาอย่างฉาวโฉ่ เนื่องจากข้อบกพร่องในการออกแบบและการนำไปใช้ให้หลีกเลี่ยง โชคดีที่เรามีทางเลือกของเราอีกสองวันที่ - เวลาห้องสมุด:
    • Joda-Time ไลบรารี่
      โอเพนซอร์สฟรียอดนิยมนี้สามารถใช้ได้กับ Java หลายเวอร์ชัน ตัวอย่างมากมายของการใช้งานอาจพบได้ใน StackOverflow การอ่านสิ่งเหล่านี้จะช่วยให้คุณเร่งความเร็วได้อย่างรวดเร็ว
    • java.time. * package
      ชุดคลาสใหม่นี้ได้รับแรงบันดาลใจจาก Joda-Time และกำหนดโดย JSR 310 คลาสเหล่านี้สร้างขึ้นใน Java 8 โปรเจ็กต์กำลังดำเนินการเพื่อย้อนกลับคลาสเหล่านี้ไปยัง Java 7 แต่ backporting ไม่ได้รับการสนับสนุน คำพยากรณ์
  • ดังที่ Kristopher Johnson ตั้งข้อสังเกตอย่างถูกต้องในความคิดเห็นของเขาในคำถามคำตอบอื่น ๆ ก็ไม่สนใจประเด็นสำคัญของ:
    • ช่วงเวลาของวัน
      ที่มีทั้งส่วนวันที่และช่วงเวลาของวัน)
    • เขตเวลา
      จุดเริ่มต้นของวันขึ้นอยู่กับเขตเวลา หากคุณล้มเหลวในการระบุเขตเวลาจะใช้เขตเวลาเริ่มต้นของ JVM นั่นหมายความว่าพฤติกรรมของรหัสของคุณอาจเปลี่ยนไปเมื่อทำงานบนคอมพิวเตอร์เครื่องอื่นหรือด้วยการตั้งค่าเขตเวลาที่แก้ไข อาจไม่ใช่สิ่งที่คุณต้องการ
    • สถาน
      ที่เกิดเหตุภาษาของสถานที่ระบุวิธีการตีความคำ (ชื่อของเดือนและวัน) พบในระหว่างการแยกวิเคราะห์ ( คำตอบโดย BalusCจัดการเรื่องนี้อย่างเหมาะสม) นอกจากนี้ Locale ยังส่งผลต่อผลลัพธ์ของตัวจัดรูปแบบบางอย่างเมื่อสร้างการแสดงสตริงของวันที่ของคุณ

Joda เวลา

หมายเหตุเล็กน้อยเกี่ยวกับการติดตาม Joda-Time

เขตเวลา

ในJoda เวลาเป็นDateTimeวัตถุอย่างแท้จริงรู้โซนเวลาของตัวเองที่ได้รับมอบหมาย สิ่งนี้ตรงกันข้ามคลาส java.util.Date ซึ่งดูเหมือนว่าจะมีเขตเวลา แต่ไม่มี

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

เนื่องจากคุณไม่มีส่วนเวลาในสตริงอินพุตของคุณ Joda-Time จะกำหนดช่วงเวลาแรกของวันของเขตเวลาที่ระบุเป็นช่วงเวลาของวัน โดยปกติจะมีความหมาย00:00:00แต่ไม่เสมอไปเนื่องจากความสามารถในการปรับเวลาตามฤดูกาล (DST)หรือความผิดปกติอื่น ๆ โดยวิธีการที่คุณสามารถทำเช่นเดียวกันตัวอย่าง DateTime ใด ๆ withTimeAtStartOfDayโดยการเรียก

ฟอร์แมตฟอร์แมต

อักขระที่ใช้ในรูปแบบของตัวจัดรูปแบบมีความคล้ายคลึงกันใน Joda-Time กับที่อยู่ใน java.util.Date/Calendar แต่ไม่เหมือนกันทุกประการ อ่านเอกสารอย่างละเอียด

การเปลี่ยนไม่ได้

เรามักจะใช้คลาสที่ไม่เปลี่ยนรูปแบบใน Joda-Time แทนที่จะแก้ไขวัตถุ Date-Time ที่มีอยู่เราเรียกเมธอดที่สร้างอินสแตนซ์ใหม่ขึ้นอยู่กับวัตถุอื่นที่คัดลอกส่วนใหญ่ยกเว้นที่ต้องการแก้ไข ตัวอย่างคือการเรียกไปยังwithZoneบรรทัดสุดท้ายด้านล่าง การเปลี่ยนไม่ได้ช่วยให้ Joda-Time มีความปลอดภัยต่อด้ายและยังสามารถทำให้งานชัดเจนยิ่งขึ้น

การแปลง

คุณจะต้องใช้ออบเจ็กต์ java.util.Date เพื่อใช้กับคลาส / กรอบงานอื่น ๆ ที่ไม่ทราบเกี่ยวกับออบเจ็กต์ Joda-Time โชคดีที่มันง่ายมากที่จะเคลื่อนที่ไปมา

เปลี่ยนจากวัตถุ java.util.Date (ชื่อที่นี่date) เป็น Joda-Time DateTime ...

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

ไปในทิศทางอื่นจาก Joda-Time ไปยังวัตถุ java.util.Date ...

java.util.Date date = dateTime.toDate();

รหัสตัวอย่าง

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

เมื่อวิ่ง ...

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z

20

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

นอกจากนี้ยังมีความแตกต่างอย่างมากระหว่าง "m" และ "M" ซึ่งใช้ตัวพิมพ์เล็กเป็นนาทีและตัวพิมพ์ใหญ่ใช้สำหรับเดือน เช่นเดียวกับ "d" และ "D" สิ่งนี้สามารถทำให้เกิดข้อบกพร่องที่ละเอียดอ่อนซึ่งมักถูกมองข้าม ดูJavadocหรือคำแนะนำในการแปลงสตริงเป็นวันที่ใน Javaสำหรับรายละเอียดเพิ่มเติม


1
m / m ค่าใช้จ่ายนี้แตกต่างผม 5 นาทีของแห้วขอบคุณสำหรับการชี้ออก :)
บัฟฟาโล

ฉันประหลาดใจที่ไม่มีใครพูดถึงเรื่องนี้ การใช้ SimpleDateFormat ในเว็บแอปพลิเคชั่น (หรือแอพมัลติเธรดอื่น ๆ ) เป็นเรื่องใหญ่ จนถึง Java 7 ฉันใช้ "FastDateFormat"
JackLThornton

18
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
    date = dateFormat.parse("2013-12-4");
    System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

    String output = dateFormat.format(date);
    System.out.println(output); // 2013-12-04
} 
catch (ParseException e) {
    e.printStackTrace();
}

มันใช้งานได้ดีสำหรับฉัน


5
สิ่งนี้จะส่งคืนวันพุธที่ 04 ธ.ค. 00:00:00 GST 2013 เนื่องจากผลผลิตไม่ใช่ 2013-12-04
Shams

ควรห่อใน ParseException ลอง / catch
svarog

สิ่งนี้จะไม่ส่งคืนค่าตามที่คาดไว้ กรุณาทดสอบก่อนที่จะให้คำแนะนำ
lifemoveson

7

คุณสามารถใช้ SimpleDateformat สำหรับสตริงการเปลี่ยนแปลงวันที่

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());


1
วิธีแยกวิเคราะห์ SimpleDateFormat ส่งคืนวัตถุวันที่ เหตุใดจึงต้องใช้ตัวสร้าง Date
nespapu

6

นอกจากนี้ SimpleDateFormat ไม่สามารถใช้ได้กับบางส่วนของเทคโนโลยีฝั่งไคลเอ็นต์เช่นGWT

ขอแนะนำให้ไปที่ Calendar.getInstance () และความต้องการของคุณคือการเปรียบเทียบสองวัน ไปนานวัน


6

Simple formatters สองตัวที่เราใช้:

  1. เราต้องการรูปแบบวันที่ใด
  2. วันที่จัดรูปแบบใดที่มีอยู่จริง

เราแยกรูปแบบวันที่เต็มเวลา:

date="2016-05-06 16:40:32";

public static String setDateParsing(String date) throws ParseException {

    // This is the format date we want
    DateFormat mSDF = new SimpleDateFormat("hh:mm a");

    // This format date is actually present
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
    return mSDF.format(formatter.parse(date));
}

5

โปรแกรมทดสอบต่ำต้อยของฉัน ฉันใช้มันเพื่อเล่นกับฟอร์แมตเตอร์และค้นหาวันที่ยาว ๆ ที่ฉันพบในล็อกไฟล์ (แต่ใครใส่ไว้ที่นั่น ... )

โปรแกรมทดสอบของฉัน:

package be.test.package.time;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class TimeWork {

    public static void main(String[] args) {    

        TimeZone timezone = TimeZone.getTimeZone("UTC");

        List<Long> longs = new ArrayList<>();
        List<String> strings = new ArrayList<>();

        //Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
        //Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
        formatter.setTimeZone(timezone);

        Date now = new Date();

        //Test dates
        strings.add(formatter.format(now));
        strings.add("01-01-1970 00:00:00.000");
        strings.add("01-01-1970 00:00:01.000");
        strings.add("01-01-1970 00:01:00.000");
        strings.add("01-01-1970 01:00:00.000");
        strings.add("01-01-1970 10:00:00.000");
        strings.add("01-01-1970 12:00:00.000");
        strings.add("01-01-1970 24:00:00.000");
        strings.add("02-01-1970 00:00:00.000");
        strings.add("01-01-1971 00:00:00.000");
        strings.add("01-01-2014 00:00:00.000");
        strings.add("31-12-1969 23:59:59.000");
        strings.add("31-12-1969 23:59:00.000");
        strings.add("31-12-1969 23:00:00.000");

        //Test data
        longs.add(now.getTime());
        longs.add(-1L);
        longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
        longs.add(1L);
        longs.add(1000L);
        longs.add(60000L);
        longs.add(3600000L);
        longs.add(36000000L);
        longs.add(43200000L);
        longs.add(86400000L);
        longs.add(31536000000L);
        longs.add(1388534400000L);
        longs.add(7260000L);
        longs.add(1417706084037L);
        longs.add(-7260000L);

        System.out.println("===== String to long =====");

        //Show the long value of the date
        for (String string: strings) {
            try {
                Date date = formatter.parse(string);
                System.out.println("Formated date : " + string + " = Long = " + date.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        System.out.println("===== Long to String =====");

        //Show the date behind the long
        for (Long lo : longs) {
            Date date = new Date(lo);
            String string = formatter.format(date);
            System.out.println("Formated date : " + string + " = Long = " + lo);        
        }
    }
}

ผลการทดสอบ:

===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000

2

ลิงค์ที่มา

สำหรับAndroid

Calendar.getInstance (). getTime ()ให้

Thu Jul 26 15:54:13 GMT+05:30 2018

ใช้

String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);

0

การแปลงสตริงเป็นวันที่:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }

-1

ลองสิ่งนี้

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(date);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.