java.util.Date를 문자열로 변환


407

Java 로 java.util.Date객체 를 변환하고 싶습니다 String.

형식은 2010-05-30 22:15:52



@harschware FYI 인 Joda-Time 프로젝트는 이제 유지 보수 모드 에 있으며 팀은 java.time 클래스 로의 마이그레이션을 조언합니다 . Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

1
Date2019 년 에는 사용하지 않는 것이 좋습니다. 이 클래스는 제대로 설계되지 않았고 오래되었습니다. 대신 현대 Java 날짜 및 시간 API 인 java.time의Instant 또는 다른 클래스를 사용하십시오 .
Ole VV

답변:


757

메소드를 사용하여 날짜문자열로 변환하십시오 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
달력은 추상 클래스이며 날짜는 구체적입니다. Date는 TimeZone, Locale 또는 우리 모두가 절대 사용하지 않는 좋은 것들에 대해 전혀 모릅니다.
nckbrz

30
MM/dd/yyyy형식은 바보 깨진입니다. 사용하지 마십시오. 항상 dd/MM/yyyy또는을 사용하십시오 yyyy-MM-dd.
SystemParadox

13
@SystemParadox-멍청하지만 그것이 무의미하지는 않습니다. 사람들이 보고서에서 기대하는 것과 일치하기 때문에 특별히 사용하라는 요청을 받았습니다. (나는 yyyy-MM-dd모든 곳을 선호 하지만 어떻게 할 수 있습니까?).
가을 레너드

223
Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);

63

Commons-lang DateFormatUtils장점 으로 가득합니다 (클래스 패스에 commons-lang이있는 경우)

//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.DateInstant. 이 Instant클래스는 나노초 의 해상도 (소수점의 최대 9 자리)로 UTC 의 타임 라인에서 순간을 나타냅니다 .

java.time과의 변환은 이전 클래스에 추가 된 새로운 메소드에 의해 수행됩니다.

Instant instant = myUtilDate.toInstant();

모두 당신 java.util.Datejava.time.Instant에있는 UTC . 날짜와 시간을 UTC로보고 싶다면 그렇게하십시오. toString표준 ISO 8601 형식으로 문자열을 생성하기 위해 호출 합니다.

String output = instant.toString();  

2014-11-14T14 : 05 : 09Z

다른 형식의 Instant경우보다 유연한 형식으로 변환해야합니다 OffsetDateTime.

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

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

해당 코드가 IdeOne.com에서 실시간으로 실행되는지 확인하십시오 .

원하는 형식으로 문자열을 얻으려면을 지정하십시오 DateTimeFormatter. 사용자 정의 형식을 지정할 수 있습니다. 그러나 미리 정의 된 포맷터 ( ISO_LOCAL_DATE_TIME) 중 하나를 사용 T하고 출력에서 ​​SPACE를 바꿉니다.

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

2014-11-14 14:05:09

그건 그렇고 나는 당신이 의도적으로 UTC에서 오프셋 또는 시간대 정보를 잃는 이러한 종류의 형식을 권장하지 않습니다 . 해당 문자열의 날짜-시간 값의 의미에 대해 모호성을 만듭니다.

또한 문자열의 날짜-시간 값 표현에서 분수 초가 무시 (효과적으로 잘림)되므로 데이터 손실에주의하십시오.

특정 지역의 벽시계 시간 의 렌즈를 통해 같은 순간을 보려면을 적용하여을 ZoneId얻습니다 ZonedDateTime.

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

zdt.toString () : 2014-11-14T14 : 05 : 09-05 : 00 [미국 / 몬트리올]

포맷 문자열을 생성하려면 위와 같이 동일한 작업을 수행하지만 교체 odt와 함께 zdt.

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의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이러한 클래스는 같은 귀찮은 된 날짜 - 시간의 수업을 대신하는 java.util.Date, .Calendar, java.text.SimpleDateFormat.

Joda 타임 프로젝트는 현재의 유지 관리 모드 , java.time로 마이그레이션을 조언한다.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오.

많은 java.time 기능은 자바 6 & 7 백 포팅 ThreeTen - 백 포트 추가에 적응 안드로이드ThreeTenABP (참조 ... 사용 방법 ).

ThreeTen - 추가 프로젝트 추가 클래스와 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 2014-11-14T14 : 05 : 09 + 00 : 00와 동일한 형식을 가진 새로운 Java 8 코드가 있습니까? 감사합니다
Bob Bolden

@BobBolden 맞습니다 . 기본적으로 Z대신 사용됩니다 +00:00. 나는 답변을 고쳤다. 참고로, 그것들은 같은 것을 의미합니다 : Z"줄루 (Zulu)"라는 발음은 0 시간-분-초의 오프셋을 의미합니다 +00:00. ISO 8601 표준은 모두 스타일을 지원합니다.
바질 부르 케

@BasilBourque 죄송합니다, 이것은 확실하지 않습니다. Java 8이 있고 instant.atOffset ()이 전혀 없습니다. Java 8이 instant.atOffset ()없이 정확히 동일한 형식 2014-11-14T14 : 05 : 09 + 00 : 00을 갖기위한 올바른 코드는 무엇인지 조언 해 주시겠습니까? 나는 조금 길을 잃었다 :(
Bob Bolden

@BobBolden Java 8 에는 실제로 클래스에 atOffset메소드 가 있습니다 . InstantJavadoc :을 참조하십시오 Instant::atOffset. Java 8에서는 같은 호출 Instant.now().atOffset( ZoneOffset.UTC ).toString()이 실행됩니다. 당신의 import진술을 확인하십시오 . IDE / 프로젝트가 이전 버전의 Java가 아닌 Java 8 이상을 실행하도록 설정되어 있는지 확인하십시오. IdeOne.com에서 실시간으로 실행되는 코드를 참조하십시오. ideone.com/2Vm2O5
Basil Bourque

19

평범한 자바의 대체 1 라이너 :

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

JVM의 현재 기본 시간대를 DateTime객체에 할당하는 대신 DateTimeZone을 전달하는 것이 좋습니다 . new DateTime( currentDate , DateTimeZone.forID( "America/Montreal" ) )
Basil Bourque

7

SimpleDateFormat을 찾고있는 것 같습니다 .

형식 : yyyy-MM-dd kk : mm : ss


"kk"가 특별한 작업을 수행합니까? 에릭은 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

나는 HH가 24 시간이고 hh가 am / pm 인 .Net 형식에 익숙합니다. 따라서 머리를 긁적.
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());

행복한 코딩 :)


1
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 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"는 읽는 날짜의 형식입니다.

출력 : 일요일 4 월 14 일 16:11:48 EEST 2013

참고 : HH vs hh-HH는 24 시간 형식을 의미합니다-hh는 12 시간 형식을 의미합니다


문제는 반대 변환에 ​​관한 것입니다.
Vadzim

4

날짜부터 시간 만 필요한 경우 문자열 기능을 사용할 수 있습니다.

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

이렇게하면 문자열의 시간 부분이 자동으로 잘라지고 안에 저장됩니다 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으로 날짜를 구문 분석 / 형식화하는 방법은 무엇입니까? (자바 8)

java.time.ZonedDateTime으로 Java8 java.util.Date 변환

인스턴트를 문자열로 형식화

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

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;
}

에서 자바 문자열로 변환 날짜


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
Date date = new Date();
String strDate = String.format("%tY-%<tm-%<td %<tH:%<tM:%<tS", date);

1

한 줄 옵션

이 옵션을 사용하면 실제 날짜를 쉽게 작성할 수 있습니다.

이 사용되어 있습니다 Calendar.classSimpleDateFormat다음이 Java8에서 사용하는 논리적 아니다.

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

1
참고로, 같은 몹시 귀찮은 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

1
(1) 대답이 잘못되었습니다 (방금 2019-20-23 09:20:2220 개월입니까 ??). (2) 대답이 다른 답변에서 아직 다루지 않은 내용을 제공한다는 것을 알 수 없습니다. (3) 젊은이들에게 오래되고 악명 높은 SimpleDateFormat학급 을 사용하도록 가르치지 마십시오 . 적어도 첫 번째 옵션은 아닙니다. 그리고 예약 없이는 아닙니다. 오늘날 우리는 java.time최신 Java 날짜 및 시간 API 와 그 기능 이 훨씬 뛰어납니다 DateTimeFormatter.
Ole VV

네 .. 실수를 저지르고 정정하는 것을 잊었습니다. 나는 그것을 빨리 길에 추가했고, 기억하지 않았다. .. 미안! 의견을 주셔서 감사합니다 여러분
Alejandro Teixeira Muñoz

@ OleV.V. 모두가 현대 Java 데이터 및 시간 API에 액세스 할 수있는 것은 아니므로 ......이 답변도 유효합니다 ...
Alejandro Teixeira Muñoz

1
귀하의 의견에 감사드립니다. Java 5 또는 Java 6 및 7에 대한 외부 종속성없이 답변을 제공하려는 경우 매우 좋습니다. 반갑습니다. 그리고 당신의 대답은 여전히 ​​잘못되어 있습니다. 새해에 놀랄 것입니다.
Ole VV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.