Java에서 YYYY-MM-DD HH : MI : Sec.Millisecond 형식으로 현재 시간을 얻는 방법은 무엇입니까?


641

아래 코드는 현재 시간을 알려줍니다. 그러나 밀리 초에 대해서는 아무것도 말하지 않습니다.

public static String getCurrentTimeStamp() {
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy
    Date now = new Date();
    String strDate = sdfDate.format(now);
    return strDate;
}

2009-09-22 16:47:08 (YYYY-MM-DD HH : MI : Sec) 형식으로 날짜를 얻습니다 .

그러나 현재 시간을 2009-09-22 16:47:08.128((YYYY-MM-DD HH : MI : Sec.Ms) 형식으로 검색하고 싶습니다 . 여기서 128은 밀리 초를 나타냅니다.

SimpleTextFormat잘 작동합니다. 여기서 가장 낮은 시간 단위는 초이지만 밀리 초는 어떻게 얻습니까?


32
다른 모든 방법이 실패하면 설명서를 읽으십시오 .
핫 릭

4
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleTextFormat지금 기존 에 의해 대체, java.time의 클래스. Oracle의 Tutorial을 참조하십시오 .
Basil Bourque

답변:


1003
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

호기심에서 SimpleDateFormat을 사용하면 어떤 이점이 있습니까? dateTime.ToString ( "yyyy-MM-dd HH : mm : ss.SSS")?
NickG

10
@NickG이 toString(String format)방법 은 어디에 있습니까 ? 은 java.util.Date그것을 가지고하지 않는 것 같습니다. Joda Time API를 언급하고 있습니까? 그러나 가능한 한 가지 이점은 동일한 포맷터 객체를 재사용한다는 것입니다. 다른 하나는 API를 추가 할 필요가 없다는 것입니다. Date 클래스는 표준 Java 라이브러리 클래스입니다.
ADTC

22
Java 8에서는 동일한 목적으로 DateTimeFormatter 를 사용할 수 있습니다 .
Vitalii Fedorenko

7
SimpleDateFormat은 스레드로부터 안전하지 않지만 최신 DateTimeFormatter는 스레드로부터 안전합니다.
devdanke

15
자바 8 날짜 API를 사용 :LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"))
rsinha

202

자바 원 라이너

public String getCurrentTimeStamp() {
    return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());
}

JDK8 스타일

public String getCurrentLocalDateTimeStamp() {
    return LocalDateTime.now()
       .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
}

9
LocalDateTime 및 DateTimeFormatter는 SimpleDateFormat과 달리 스레드로부터 안전합니다
Maxple

@ SimpleDateFormat이 문제를 일으키는 경우가 있습니까?
gaurav




31

tl; dr

Instant.now()
       .toString()

2016-05-06T23 : 24 : 25.694Z

ZonedDateTime
.now
( 
    ZoneId.of( "America/Montreal" ) 
)
.format(  DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )

2016-05-06 19 : 24 : 25.694

java.time

Java 8 이상에는 Java 8 이상에 내장 된 java.time 프레임 워크 가 있습니다 . 이 새로운 클래스는 번거로운 오래된 java.util.Date/.Calendar 클래스를 대체합니다. 새로운 클래스는 개념적으로 유사하지만 재구성 된 후계자로 의도 된 매우 성공적인 Joda-Time 프레임 워크에서 영감을 받았습니다 . JSR 310에 의해 정의됩니다 . ThreeTen-Extra에 의해 확장 프로젝트로 . 학습서를 참조하십시오 .

java.time은 나노초 가 가능합니다. java.util.Date & Joda-Time 의 밀리 초 해상도 (소수점 3 자리 )와 비교하여 해상도 (소수 초의 소수 자리 9 자리 )를 사용할 수 있습니다. 따라서 소수점 이하 세 자리 만 표시하도록 서식을 지정하면 데이터를 숨길 수 있습니다.

데이터에서 마이크로 초 또는 나노초를 제거하려면 잘립니다.

Instant instant2 = instant.truncatedTo( ChronoUnit.MILLIS ) ;

java.time 클래스는 문자열 구문 분석 / 생성시 기본적으로 ISO 8601 형식을 사용 합니다. Z끝에 있는 A 는 짧고 Zulu의미합니다. UTC를 합니다.

Instant최대의 해상도 UTC의 타임 라인에 잠시 나타냅니다 나노초 . Java 8에서 현재 순간캡처하는 것은 밀리 초로 제한 되며 Java 9의 새로운 구현은 컴퓨터의 하드웨어 시계 기능에 따라 최대 나노초까지 캡처합니다.

Instant instant = Instant.now (); // Current date-time in UTC.
String output = instant.toString ();

2016-05-06T23 : 24 : 25.694Z

를 교체 T공백으로 중간에, 그리고 Z아무것도가 원하는 출력을 얻을 수 있습니다.

String output = instant.toString ().replace ( "T" , " " ).replace( "Z" , "" ; // Replace 'T', delete 'Z'. I recommend leaving the `Z` or any other such [offset-from-UTC][7] or [time zone][7] indicator to make the meaning clear, but your choice of course.

2016-05-06 23 : 24 : 25.694

오프셋 또는 시간대를 포함하지 않아도되므로 특정 지역과 관련이없는 "현지"날짜-시간을 만드십시오.

String output = LocalDateTime.now ( ).toString ().replace ( "T", " " );

조다 타임

매우 성공적인 Joda-Time 라이브러리는 java.time 프레임 워크에 대한 영감이었습니다. 편리한 경우 java.time으로 마이그레이션하는 것이 좋습니다.

ISO 8601 형식 (밀리 초)을 포함하며, 기본값입니다 Joda 타임 2.4 라이브러리.

System.out.println( "Now: " + new DateTime ( DateTimeZone.UTC ) );

달릴 때…

Now: 2013-11-26T20:25:12.014Z

또한 필요한 경우 밀리 초를 초 단위로 숫자로 요청할 수 있습니다.

int millisOfSecond = myDateTime.getMillisOfSecond ();

9

가장 쉬운 방법은 (Java 8 이전) 사용하는 것입니다.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

그러나 SimpleDateFormat 은 스레드로부터 안전하지 않습니다. java.util.Date 어느 것도 아닙니다 . 이로 인해 사용자에게 동시성 문제가 발생할 수 있습니다. 그리고 기존 디자인에는 많은 문제가 있습니다. 이제 Java 8에서이를 극복하기 위해 java.time 이라는 별도의 패키지가 있습니다 . 이 Java SE 8 날짜 및 시간 문서에는 이에 대한 개요가 있습니다.

따라서 Java 8에서는 다음과 같은 방법으로 현재 날짜 / 시간을 형식화하는 트릭을 수행합니다.

LocalDateTime.now()
   .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

주목해야 할 것은 인기있는 타사 라이브러리 joda-time 의 도움으로 개발되었으며 ,

이 프로젝트는 JSR 310에 따라 Joda-Time (Stephen Colebourne)과 Oracle의 저자가 공동으로 이끌 었으며 새로운 Java SE 8 패키지 java.time에 나타날 것입니다.

그러나 이제는 joda-time더 이상 사용되지 않으며 사용자에게 new로 마이그레이션하도록 요청했습니다 java.time.

Java SE 8부터는이 프로젝트를 대체하는 JDK의 핵심 부분 인 java.time (JSR-310)으로 마이그레이션하라는 메시지가 표시됩니다.

어쨌든,

캘린더 인스턴스 가있는 경우 아래를 사용하여 새 인스턴스로 변환 할 수 있습니다 java.time.

    Calendar calendar = Calendar.getInstance();
    long longValue = calendar.getTimeInMillis();         

    LocalDateTime date =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
    String formattedString = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(date.toString()); // 2018-03-06T15:56:53.634
    System.out.println(formattedString); // 2018-03-06 15:56:53.634

Date 객체가 있다면

    Date date = new Date();
    long longValue2 = date.getTime();

    LocalDateTime dateTime =
            LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue2), ZoneId.systemDefault());
    String formattedString = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));

    System.out.println(dateTime.toString()); // 2018-03-06T15:59:30.278
    System.out.println(formattedString);     // 2018-03-06 15:59:30.278

획기적인 시간을 가졌다면

LocalDateTime date =
        LocalDateTime.ofInstant(Instant.ofEpochMilli(epochLongValue), ZoneId.systemDefault());

최소 API 레벨은 26입니다.
AbhinayMe


4

위의 답변을 보완하기 위해 다음은 밀리 초를 포함하여 현재 시간과 날짜를 인쇄하는 프로그램의 작은 작동 예입니다.

import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
    public static void main(String argv[]){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date now = new Date();
        String strDate = sdf.format(now);
        System.out.println(strDate);
    }
}


2

이것을 사용하여 현재 시간 을 지정된 형식 으로 가져옵니다 .

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 System.out.print(dateFormat.format(System.currentTimeMillis()));  }

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

실제로 나는이 솔루션을 Android App 용으로 사용하고 있었지만 Android에서 Java.time 클래스를 사용하려면 API를 27 이상으로 설정해야합니다. 어쨌든 정보를 공유해 주셔서 감사합니다.
Abhishek Sengupta

거의 모든 java.time 기능은 사실상 동일한 API를 사용 하여 ThreeTen-Backport 프로젝트 에서 Java 6 & 7로 백 포트됩니다 . ThreeTenABP 프로젝트 에서 Android <26에 더 적합합니다 . 따라서 피 묻은 끔찍한 옛날 데이트 수업을 다시 만질 이유가 없습니다.
바질 부르 케

2

밀리 초로 날짜와 시간을 표시하는 간단한 예가 있습니다 ...

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class MyClass{

    public static void main(String[]args){
        LocalDateTime myObj = LocalDateTime.now();
        DateTimeFormatter myFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS);
        String forDate = myObj.format(myFormat);
        System.out.println("The Date and Time are: " + forDate);
    }
}

좋아 보이지만 rsinha의 5 살짜리 주석 에 대한 통찰력을 추가 합니까?
greybeard


1

답변 :

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
ZonedDateTime start = Instant.now().atZone(ZoneId.systemDefault());
String startTimestamp = start.format(dateFormatter);


0

java.text (Java 8 이전)

public static ThreadLocal<DateFormat> dateFormat = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    };
};

...
dateFormat.get().format(new Date());

java.time

public static DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

...
dateTimeFormatter.format(LocalDateTime.now());

-1

원하는 형식으로 간단하게 가져올 수 있습니다.

String date = String.valueOf(android.text.format.DateFormat.format("dd-MM-yyyy", new java.util.Date()));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.