แปลง java.util.Date เป็น String


407

ฉันต้องการแปลงjava.util.Dateวัตถุเป็น a Stringใน Java

รูปแบบคือ 2010-05-30 22:15:52


2
คำถามที่คล้ายกัน: stackoverflow.com/questions/4772425/format-date-in-java
Vadzim

@harschware FYI โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาโดยทีมงานจะแนะนำการย้ายไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

1
ฉันไม่แนะนำให้คุณใช้และDateในปี 2019 คลาสนั้นออกแบบมาไม่ดีและล้าสมัยไปนาน ใช้แทนInstantหรือระดับอื่นจากjava.time วันที่ Java ที่ทันสมัยและเวลา API
Ole VV

คำตอบ:


757

แปลงDateเป็นStringโดยใช้DateFormat#formatวิธีการ:

String pattern = "MM/dd/yyyy HH:mm:ss";

// Create an instance of SimpleDateFormat used for formatting 
// the string representation of date according to the chosen pattern
DateFormat df = new SimpleDateFormat(pattern);

// Get the today date using Calendar object.
Date today = Calendar.getInstance().getTime();        
// Using DateFormat format method we can create a string 
// representation of a date with the defined format.
String todayAsString = df.format(today);

// Print the result!
System.out.println("Today is: " + todayAsString);

จากhttp://www.kodejava.org/examples/86.html


25
ทำไมต้องใช้Calendarแทนธรรมดาnew Date()? มีความแตกต่างหรือไม่?
Alexander Malakhov

10
ระวัง: SimpleDateFormat ไม่ปลอดภัยสำหรับเธรด stackoverflow.com/questions/6840803/…
Zags

23
ปฏิทินเป็นคลาสนามธรรมวันที่เป็นรูปธรรม วันที่ไม่มีความคิดเกี่ยวกับเขตเวลาสถานที่หรือสิ่งที่ดีที่เราไม่เคยใช้
nckbrz

30
MM/dd/yyyyรูปแบบโง่และเสีย อย่าใช้มัน การใช้งานเสมอหรือdd/MM/yyyy yyyy-MM-dd
SystemParadox

13
@SystemParadox - มันงี่เง่า แต่นั่นก็ไม่ได้ทำให้ไร้สาระ ฉันถูกขอให้ใช้งานเป็นพิเศษเพราะตรงกับสิ่งที่ผู้คนคาดหวังในรายงาน (ฉันต้องการได้yyyy-MM-ddทุกที่ แต่คุณจะทำอะไรได้บ้าง)
Autumn Leonard


63

คอมมอนส์ lang- date DateFormatUtilsเต็มไปด้วยสินค้า (ถ้าคุณมีคอมมอนส์ lang ใน classpath ของคุณ)

//Formats a date/time into a specific pattern
 DateFormatUtils.format(yourDate, "yyyy-MM-dd HH:mm:SS");

ต้องมีการnullตรวจสอบเพิ่มเติม
Farrukh Chishti

23

TL; DR

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

วิธีที่ทันสมัยคือคลาส java.time ที่แทนที่คลาสวันที่และเวลาเก่าที่ลำบาก

แปลงแรกของคุณไปยังjava.util.Date ชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)InstantInstant

การแปลงเป็น / จาก java.time ดำเนินการโดยวิธีการใหม่ที่เพิ่มในคลาสเก่า

Instant instant = myUtilDate.toInstant();

ทั้งของคุณjava.util.Dateและjava.time.Instantอยู่ในUTC หากคุณต้องการดูวันที่และเวลาในรูปแบบ UTC โปรดทำตาม เรียกใช้toStringเพื่อสร้างสตริงในรูปแบบISO 8601 มาตรฐาน

String output = instant.toString();  

2014-11-14T14: 05: 09Z

สำหรับรูปแบบอื่น ๆ ที่คุณต้องการที่จะเปลี่ยนคุณเข้าสู่ความยืดหยุ่นมากขึ้นInstantOffsetDateTime

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2020-05-01T21: 25: 35.957Z

เห็นว่ารหัสทำงานอยู่ที่ IdeOne.com

ที่จะได้รับในรูปแบบ String DateTimeFormatterคุณต้องการระบุ คุณสามารถระบุรูปแบบที่กำหนดเองได้ แต่ฉันจะใช้หนึ่งในฟอร์แมตเตอร์ที่กำหนดไว้ล่วงหน้า ( ISO_LOCAL_DATE_TIME) และแทนที่Tในเอาต์พุตด้วย SPACE

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

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

ระวังการสูญหายของข้อมูลเนื่องจากเศษส่วนที่สองจะถูกละเว้น (ถูกตัดทอนอย่างมีประสิทธิภาพ) ในการแสดงค่าวันที่และเวลาของสตริง

จะเห็นว่าช่วงเวลาเดียวกันผ่านเลนส์ของบางภูมิภาคโดยเฉพาะอย่างยิ่งในเวลาที่ผนังนาฬิกาให้ใช้จะได้รับZoneIdZonedDateTime

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [อเมริกา / มอนทรีออล]

เพื่อสร้างรูปแบบ String ทำเช่นเดียวกันกับข้างต้น แต่แทนที่ด้วยodtzdt

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

String::replaceถ้ารันรหัสนี้เป็นจำนวนมากครั้งคุณอาจต้องการที่จะเป็นบิตมีประสิทธิภาพมากขึ้นและหลีกเลี่ยงการเรียกร้องให้ การวางสายนั้นจะทำให้รหัสของคุณสั้นลง หากต้องการให้ระบุรูปแบบการจัดรูปแบบของคุณเองในDateTimeFormatterวัตถุของคุณเอง แคชอินสแตนซ์นี้เป็นค่าคงที่หรือสมาชิกเพื่อใช้ซ้ำ

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

ใช้ตัวจัดรูปแบบนั้นโดยส่งอินสแตนซ์

String output = zdt.format( f );

เกี่ยวกับ java.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, และ.Calendarjava.text.SimpleDateFormat

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยัง java.time

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย

ฟังก์ชั่นจาวาส่วนใหญ่นั้นกลับไปที่ Java 6 และ 7 ในThreeTen-Backportและปรับใช้กับAndroidในThreeTenABP เพิ่มเติม (ดูวิธีการใช้ ... )

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time


นี่คือตัวอย่างโค้ดของการจัดรูปแบบด้วย Java 8 Time API: stackoverflow.com/a/43457343/603516
Vadzim

รหัสนี้ไม่ทำงาน OffsetDateTime odt = instant.atOffset (ZoneOffset.UTC); odt.toString (): 2014-11-14T14: 05: 09 + 00: 00 มีโค้ด Java 8 ใหม่ที่จะมีรูปแบบเดียวกัน 2014-11-14T14: 05: 09 + 00: 00 หรือไม่ ขอบคุณ
Bob Bolden

@BobBolden คุณถูกต้องถูกZใช้แทน+00:00ค่าเริ่มต้น ฉันแก้ไขคำตอบขอบคุณ FYI เหล่านั้นหมายถึงสิ่งเดียวกัน: Zเด่นชัด“ซูลู” +00:00หมายถึงชดเชยศูนย์ชั่วโมงนาทีวินาทีเช่นเดียวกับ 8601 ISOมาตรฐานการสนับสนุนทั้งสองรูปแบบ
Basil Bourque

@BasilBourque ขออภัยนี่ไม่ชัดเจน ฉันมี Java 8 และไม่มี instant.atOffset () เลย คุณช่วยแนะนำได้ไหมว่ารหัสที่ถูกต้องสำหรับ Java 8 จะมีรูปแบบเหมือนกันคืออะไร 2014-11-14T14: 05: 09 + 00: 00 โดยไม่มี instant.atOffset () ฉันหลงทางเล็กน้อย :(
Bob Bolden

@BobBolden มีแน่นอนเป็นatOffsetวิธีการในInstantการเรียนใน Java 8. ดู Instant::atOffsetJavadoc: ใน Java 8 การโทรเช่นInstant.now().atOffset( ZoneOffset.UTC ).toString()จะทำงาน ตรวจสอบใบimportแจ้งยอดของคุณ ตรวจสอบว่า IDE / โครงการของคุณได้รับการตั้งค่าให้รัน Java 8 หรือใหม่กว่าแทนที่จะใช้ Java เวอร์ชันก่อนหน้า ดูโค้ดที่เผยแพร่สดได้ที่ IdeOne.com: ideone.com/2Vm2O5
Basil Bourque

19

Altenative one-liners ใน java แบบธรรมดา:

String.format("The date: %tY-%tm-%td", date, date, date);

String.format("The date: %1$tY-%1$tm-%1$td", date);

String.format("Time with tz: %tY-%<tm-%<td %<tH:%<tM:%<tS.%<tL%<tz", date);

String.format("The date and time in ISO format: %tF %<tT", date);

สิ่งนี้ใช้ตัวจัดรูปแบบและการจัดทำดัชนีแบบสัมพันธ์แทนSimpleDateFormatซึ่งไม่ปลอดภัยสำหรับเธรด btw

ทำซ้ำได้มากขึ้นเล็กน้อย แต่ต้องการเพียงหนึ่งคำสั่ง อาจเป็นประโยชน์ในบางกรณี


1
นี่คืออัจฉริยะ (ใน) ประสิทธิภาพที่ดีขึ้นมากสำหรับสภาพแวดล้อมที่ จำกัด
Ruslan

9

ทำไมคุณไม่ใช้ Joda (org.joda.time.DateTime) มันเป็นพื้นซับเดียว

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09

ฉันขอแนะนำให้ส่ง DateTimeZone ด้วยแทนที่จะกำหนดเขตเวลาเริ่มต้นปัจจุบันของ JVM ให้กับDateTimeวัตถุ new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque

7

ดูเหมือนว่าคุณกำลังมองหาSimpleDateFormat

รูปแบบ: yyyy-MM-dd kk: mm: ss


"kk" ทำอะไรเป็นพิเศษหรือไม่? ฉันคิดว่า Eric ต้องการมันในเวลา 24 ชั่วโมง
Charlie Salts

2
ใช่ชั่วโมงต่อวัน (1-24) แต่นี่ไม่ใช่สิ่งที่ OP ต้องการ HH(0-23) เป็นเรื่องปกติมากขึ้น
BalusC

1
@Cahrlie Salts kk เริ่มจาก 1-24 ซึ่ง HH ไปจาก 0-23 และอาจเป็นเรื่องที่คิดว่าฉันค่อนข้างสันนิษฐานว่าเขาต้องการ 1-24 @BalusC วัตถุ DateFormat แยกวิเคราะห์และรูปแบบ
pickypg

ฉันไม่เข้าใจความเกี่ยวข้องของความคิดเห็นล่าสุดของคุณ ความคิดเห็นของฉันคือชาร์ลี
BalusC

ฉันคุ้นเคยกับรูปแบบ. Net ที่ HH เป็นเวลา 24 ชั่วโมงและ hh คือ am / pm ดังนั้นการเกาหัว
Charlie Salts

5

ในนัดเดียว;)

เพื่อให้ได้วันที่

String date = new SimpleDateFormat("yyyy-MM-dd",   Locale.getDefault()).format(new Date());

เพื่อให้ได้เวลา

String time = new SimpleDateFormat("hh:mm", Locale.getDefault()).format(new Date());

เพื่อให้ได้วันและเวลา

String dateTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.getDefaut()).format(new Date());

Happy coding :)


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

4
public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}

4

วิธีที่ง่ายที่สุดในการใช้งานมีดังต่อไปนี้:

currentISODate = new Date().parse("yyyy-MM-dd'T'HH:mm:ss", "2013-04-14T16:11:48.000");

โดยที่ "yyyy-MM-dd'T'HH: mm: ss" เป็นรูปแบบของวันที่อ่าน

เอาท์พุท: อาทิตย์ 14 เมษายน 16:11:48 EEST 2013

หมายเหตุ: HH vs hh - HH หมายถึงรูปแบบเวลา 24 ชั่วโมง - hh หมายถึงรูปแบบเวลา 12 ชั่วโมง


คำถามเกี่ยวกับการแปลงตรงข้าม
Vadzim

4

หากคุณต้องการเวลาจากวันที่คุณสามารถใช้คุณสมบัติของ String

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

นี้โดยอัตโนมัติจะตัดส่วนเวลาของ String timeStringและบันทึกไว้ภายใน


สิ่งนี้อาจแตกต่างกับภาษาอื่น
Vadzim

4

นี่คือตัวอย่างของการใช้Java 8 Time API ใหม่เพื่อจัดรูปแบบดั้งเดิม java.util.Date :

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z")
        .withZone(ZoneOffset.UTC);
    String utcFormatted = formatter.format(date.toInstant()); 

    ZonedDateTime utcDatetime = date.toInstant().atZone(ZoneOffset.UTC);
    String utcFormatted2 = utcDatetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS Z"));
    // gives the same as above

    ZonedDateTime localDatetime = date.toInstant().atZone(ZoneId.systemDefault());
    String localFormatted = localDatetime.format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
    // 2011-12-03T10:15:30+01:00[Europe/Paris]

    String nowFormatted = LocalDateTime.now().toString(); // 2007-12-03T10:15:30.123

เป็นเรื่องที่ดีเกี่ยวกับDateTimeFormatterว่าสามารถแคชได้อย่างมีประสิทธิภาพเนื่องจากมันปลอดภัยต่อเธรด (ไม่เหมือนSimpleDateFormat)

รายการของ fomatters กำหนดไว้ล่วงหน้าและการอ้างอิงรูปแบบสัญกรณ์

เครดิต:

วิธีการแยก / จัดรูปแบบวันที่ด้วย LocalDateTime (Java 8)

Java8 java.util.Date แปลงเป็น java.time.ZonedDateTime

จัดรูปแบบทันทีเป็นสตริง

ความแตกต่างระหว่าง java 8 ZonedDateTime และ OffsetDateTime คืออะไร


2

ลองนี้

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

เอาท์พุท:

2013-05-14 17:07:21

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการจัดรูปแบบวันที่และเวลาในลิงค์อ้างอิงจาวาด้านล่าง

ศูนย์ช่วยเหลือของ Oracle

ตัวอย่างวันที่เวลาใน java


1
public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}

1

ลองทำสิ่งนี้

public static void main(String args[]) {

    Calendar cal = GregorianCalendar.getInstance();
    Date today = cal.getTime();
    DateFormat df7 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try {           
        String str7 = df7.format(today);
        System.out.println("String in yyyy-MM-dd format is: " + str7);          
    } catch (Exception ex) {
      ex.printStackTrace();
    }
}

หรือฟังก์ชั่นยูทิลิตี้

public String convertDateToString(Date date, String format) {
    String dateStr = null;
    DateFormat df = new SimpleDateFormat(format);

    try {
        dateStr = df.format(date);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return dateStr;
}

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


1
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String date = "2010-05-30 22:15:52";
    java.util.Date formatedDate = sdf.parse(date); // returns a String when it is parsed
    System.out.println(sdf.format(formatedDate)); // the use of format function returns a String


1

ตัวเลือกหนึ่งบรรทัด

ตัวเลือกนี้ได้ง่ายเพียงบรรทัดเดียวเพื่อเขียนวันที่จริง

โปรดทราบว่านี่คือการใช้Calendar.classและSimpleDateFormatจากนั้นก็ไม่ได้ใช้ตรรกะภายใต้ Java8

yourstringdate =  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());

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

1
(1) คำตอบนั้นผิด (ฉันเพิ่งจะได้2019-20-23 09:20:22- เดือนที่ 20 ??) (2) ฉันไม่เห็นว่าคำตอบนั้นให้อะไรที่ไม่ได้กล่าวถึงในคำตอบอื่น (3) โปรดอย่าสอนคนหนุ่มสาวให้ใช้SimpleDateFormatคลาสที่ล้าสมัยและมีปัญหาอย่างฉาวโฉ่ อย่างน้อยก็ไม่ใช่ตัวเลือกแรก และไม่ได้โดยไม่ต้องจองใด ๆ วันนี้เรามีมากดีกว่าในการjava.timeที่ทันสมัย Java วันที่และเวลา API,DateTimeFormatterและ
Ole VV

ใช่ .... ฉันทำผิดพลาดและลืมที่จะแก้ไข ฉันเพิ่มอย่างรวดเร็วและจำไม่ได้ .. ขอโทษ !! และขอขอบคุณสำหรับความคิดเห็นของคุณ
Alejandro Teixeira Muñoz

@ OleV.V ไม่ใช่ทุกคนที่สามารถเข้าถึงข้อมูล Modern Java และเวลา api ...... ดังนั้น ... มันเป็นคำตอบที่ถูกต้องเช่นนี้ ...
Alejandro Teixeira Muñoz

1
ขอบคุณสำหรับความคิดเห็นของคุณ หากคุณต้องการให้คำตอบสำหรับ Java 5 หรือสำหรับ Java 6 และ 7 โดยไม่ต้องพึ่งพาภายนอกใด ๆ ก็ดียินดีต้อนรับโปรดแจ้งให้ชัดเจนว่าเป็นสิ่งที่คุณกำลังทำอยู่ และคำตอบของคุณยังคงผิดคุณจะได้รับความประหลาดใจในช่วงปีใหม่
Ole VV
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.