Java에서 현재 순간의 년, 월, 일,시, 분, 초 및 밀리 초를 얻는 방법은 무엇입니까?


104

Java에서 현재 순간의 년, 월, 일,시, 분, 초 및 밀리 초를 어떻게 얻을 수 있습니까? 나는 그들을 Strings.

답변:


254

이를 위해 getter를 사용할 수 있습니다 java.time.LocalDateTime.

LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int millis = now.get(ChronoField.MILLI_OF_SECOND); // Note: no direct getter available.

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

또는 아직 Java 8을 사용하지 않는 경우 java.util.Calendar.

Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1; // Note: zero based!
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
int millis = now.get(Calendar.MILLISECOND);

System.out.printf("%d-%02d-%02d %02d:%02d:%02d.%03d", year, month, day, hour, minute, second, millis);

어느 쪽이든 현재 다음과 같이 인쇄됩니다.

2010-04-16 15 : 15 : 17.816

을 변환하려면 intString의 메이크업에 사용 String#valueOf().


결국 당신의 의도가 인간에게 친숙한 문자열 형식으로 정렬하고 표시하는 것이라면 Java8 java.time.format.DateTimeFormatter( tutorial here ) 을 더 잘 사용 하십시오 .

LocalDateTime now = LocalDateTime.now();
String format1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
String format2 = now.atZone(ZoneId.of("GMT")).format(DateTimeFormatter.RFC_1123_DATE_TIME);
String format3 = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss", Locale.ENGLISH));

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

또는 아직 Java 8을 사용하지 않는 경우 다음을 사용하십시오 java.text.SimpleDateFormat.

Date now = new Date(); // java.util.Date, NOT java.sql.Date or java.sql.Timestamp!
String format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(now);
String format2 = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH).format(now);
String format3 = new SimpleDateFormat("yyyyMMddHHmmss", Locale.ENGLISH).format(now);

System.out.println(format1);
System.out.println(format2);
System.out.println(format3);

어느 쪽이든 결과는 다음과 같습니다.

2010-04-16T15 : 15 : 17.816
2010 년 4 월 16 일 금요일 15:15:17 GMT
20100416151517

또한보십시오:


printf를 사용하려는 경우 중간 단계 (예 : "% 1 $ tm % 1 $ te, % 1 $ tY", c)를 사용하는 대신 날짜 / 시간 형식을 사용하는 것이 좋습니다 (java.util. 전체 구문 포맷터)
M. Jessup

1
@미디엄. Jessup : 정말 더 좋습니다. 그러나 나는 그것을 사용한 적이 없어서 머리 위에서 입력 할 수 없었고, 위의 내용은 데모 용입니다. 어쨌든, 나는 차라리 SimpleDateFormat또는 DateTimeFormatter그 특정 작업에 대해 :)
BalusC

Java가 직접 제공하는 잘못 설계된 날짜 및 달력에 비해 훨씬 멋지고 이해하기 쉬운 API이므로 joda-time을 사용하는 것이 좋습니다.
Kaitsu

특히 i18n 작업에서 startTime 또는 endTime을 얻기 위해 이것을 선호합니다.new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).format(new Date());
Eddy

1
대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 및 7로 백 포트됩니다 .
Basil Bourque

30

joda-time으로 전환하면 세 줄로이 작업을 수행 할 수 있습니다.

DateTime jodaTime = new DateTime();

DateTimeFormatter formatter = DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS");
System.out.println("jodaTime = " + formatter.print(jodaTime));

달력을 사용하지 않고도 날짜의 개별 필드에 직접 액세스 할 수도 있습니다.

System.out.println("year = " + jodaTime.getYear());
System.out.println("month = " + jodaTime.getMonthOfYear());
System.out.println("day = " + jodaTime.getDayOfMonth());
System.out.println("hour = " + jodaTime.getHourOfDay());
System.out.println("minute = " + jodaTime.getMinuteOfHour());
System.out.println("second = " + jodaTime.getSecondOfMinute());
System.out.println("millis = " + jodaTime.getMillisOfSecond());

출력은 다음과 같습니다.

jodaTime = 2010-04-16 18:09:26.060

year = 2010
month = 4
day = 16
hour = 18
minute = 9
second = 26
millis = 60

http://www.joda.org/joda-time/ 에 따르면

Joda-Time은 사실상 Java 용 표준 날짜 및 시간 라이브러리입니다. Java SE 8부터 사용자는 java.time (JSR-310)으로 마이그레이션해야합니다.


1
참고로 Joda-Time 프로젝트는 현재 유지 관리 중이며 팀은 java.time 클래스로의 마이그레이션을 조언합니다. Joda-Time과 java.time은 같은 사람인 Stephen Colebourne이 이끌고 있습니다.
Basil Bourque

7
    // Java 8
    System.out.println(LocalDateTime.now().getYear());       // 2015
    System.out.println(LocalDateTime.now().getMonth());      // SEPTEMBER
    System.out.println(LocalDateTime.now().getDayOfMonth()); // 29
    System.out.println(LocalDateTime.now().getHour());       // 7
    System.out.println(LocalDateTime.now().getMinute());     // 36
    System.out.println(LocalDateTime.now().getSecond());     // 51
    System.out.println(LocalDateTime.now().get(ChronoField.MILLI_OF_SECOND)); // 100

    // Calendar
    System.out.println(Calendar.getInstance().get(Calendar.YEAR));         // 2015
    System.out.println(Calendar.getInstance().get(Calendar.MONTH ) + 1);   // 9
    System.out.println(Calendar.getInstance().get(Calendar.DAY_OF_MONTH)); // 29
    System.out.println(Calendar.getInstance().get(Calendar.HOUR_OF_DAY));  // 7
    System.out.println(Calendar.getInstance().get(Calendar.MINUTE));       // 35
    System.out.println(Calendar.getInstance().get(Calendar.SECOND));       // 32
    System.out.println(Calendar.getInstance().get(Calendar.MILLISECOND));  // 481

    // Joda Time
    System.out.println(new DateTime().getYear());           // 2015
    System.out.println(new DateTime().getMonthOfYear());    // 9
    System.out.println(new DateTime().getDayOfMonth());     // 29
    System.out.println(new DateTime().getHourOfDay());      // 7
    System.out.println(new DateTime().getMinuteOfHour());   // 19
    System.out.println(new DateTime().getSecondOfMinute()); // 16
    System.out.println(new DateTime().getMillisOfSecond()); // 174

    // Formatted
    // 2015-09-28 17:50:25.756
    System.out.println(new Timestamp(System.currentTimeMillis()));

    // 2015-09-28T17:50:25.772
    System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH).format(new Date()));

    // Java 8
    // 2015-09-28T17:50:25.810
    System.out.println(LocalDateTime.now());

    // joda time
    // 2015-09-28 17:50:25.839
    System.out.println(DateTimeFormat.forPattern("YYYY-MM-dd HH:mm:ss.SSS").print(new org.joda.time.DateTime()));

이 답변은 실제로 형식이 지정된 문자열이 아닌 날짜-시간 값의 구성 요소에 액세스할지 묻는 질문을 해결합니다.
Basil Bourque 2015 년

6

Java 8 이상에서는 java.time 패키지를 사용하십시오 .

ZonedDateTime.now().getYear();
ZonedDateTime.now().getMonthValue();
ZonedDateTime.now().getDayOfMonth();
ZonedDateTime.now().getHour();
ZonedDateTime.now().getMinute();
ZonedDateTime.now().getSecond();

ZonedDateTime.now()기본 시간대의 시스템 시계에서 현재 날짜-시간을 반환하는 정적 메서드입니다. 모든 get 메서드는 int값을 반환합니다 .


LocalDateTime이것에 대해 정확히 잘못된 클래스입니다. 시간대 또는 UTC로부터의 오프셋에 대한 개념이 없기 때문에 특정 순간을 추적하는 데 사용할 수 없으며 타임 라인의 지점 이 아닙니다 . 사용 Instant, ZonedDateTime또는 OffsetDateTime대신.
Basil Bourque

네가 옳아. 를 사용하도록 내 대답을 수정했습니다 ZonedDateTime.
Ortomala Lokni

3

tl; dr

ZonedDateTime.now(                    // Capture current moment as seen in the wall-clock time used by the people of a particular region (a time zone).
    ZoneId.of( "America/Montreal" )   // Specify desired/expected time zone. Or pass `ZoneId.systemDefault` for the JVM’s current default time zone.
)                                     // Returns a `ZonedDateTime` object.
.getMinute()                          // Extract the minute of the hour of the time-of-day from the `ZonedDateTime` object.

42

ZonedDateTime

특정 지역 (시간대)의 사람들이 사용하는 벽시계 시간에 표시된 현재 순간을 캡처하려면을 사용하십시오 ZonedDateTime.

시간대는 날짜를 결정하는 데 중요합니다. 주어진 순간에 날짜는 지역별로 전 세계적으로 다릅니다. 예를 들어, 파리 에서 자정 이후 몇 분이 지나면 프랑스몬트리올 퀘벡 에서는 여전히 '어제'인 새로운 날 입니다.

시간대가 지정되지 않은 경우 JVM은 현재 기본 시간대를 내재적으로 적용합니다. 이 기본값은 런타임 (!) 중에 언제든지 변경 될 수 있으므로 결과가 다를 수 있습니다. 더 나은 당신의 지정 원하는 / 예상 시간대를 인수로 명시 적으로.

지정 적절한 시간대 이름 의 형식 continent/region예컨대, America/Montreal, Africa/Casablanca, 또는 Pacific/Auckland. EST또는 IST과 같은 3-4 자 약어 는 표준 시간대 가 아니고 , 표준화되지 않았으며, 고유하지도 않은 (!)이므로 사용하지 마십시오.

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

많은 게터 중 하나를 호출하여 날짜-시간 조각을 꺼내십시오.

int    year        = zdt.getYear() ;
int    monthNumber = zdt.getMonthValue() ;
String monthName   = zdt.getMonth().getDisplayName( TextStyle.FULL , Locale.JAPAN ) ;  // Locale determines human language and cultural norms used in localizing. Note that `Locale` has *nothing* to do with time zone.
int    dayOfMonth  = zdt.getDayOfMonth() ;
String dayOfWeek   = zdt.getDayOfWeek().getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
int    hour        = zdt.getHour() ;  // Extract the hour from the time-of-day.
int    minute      = zdt.getMinute() ;
int    second      = zdt.getSecond() ;
int    nano        = zdt.getNano() ;

java.time의 클래스에 해결 나노초 . 귀하의 질문은 밀리 초 단위 의 1 초를 요청했습니다 . 당연히 백만으로 나누면 데이터 손실 가능성이 있지만 나노초를 밀리 초로 줄일 수 있습니다. 또는 TimeUnit그러한 변환을 위해 열거 형을 사용하십시오 .

long millis = TimeUnit.NANOSECONDS.toMillis( zdt.getNano() ) ;

DateTimeFormatter

String텍스트 조각을 결합하는를 생성하려면 DateTimeFormatterclass를 사용하십시오 . 이에 대한 자세한 내용은 Stack Overflow를 검색하십시오.

Instant

일반적으로 UTC로 순간을 추적하는 것이 가장 좋습니다. 존 날짜-시간에서 UTC로 조정하려면 Instant.

Instant instant = zdt.toInstant() ;

그리고 다시 돌아가십시오.

ZonedDateTime zdt = instant.atZone( ZoneId.of( "Africa/Tunis" ) ) ;

LocalDateTime

몇 가지 다른 Answers가 LocalDateTime클래스를 사용합니다 . 이 클래스는 의도적으로 표준 시간대 또는 UTC로부터의 오프셋 개념이 없기 때문에 실제 순간, 타임 라인의 특정 순간을 추적하는 목적에 적합하지 않습니다.

그래서 무엇이 LocalDateTime좋은가요? 사용 LocalDateTime당신이 날짜 및 시간을 적용하고자 할 때 어떤 지역 또는 모든 지방 이 아닌 하나의 특정의 지역.

예를 들어 올해 크리스마스는 LocalDateTime.parse( "2018-12-25T00:00:00" ). 이 값은 시간대 (a ZoneId)를 적용 하여 ZonedDateTime. 크리스마스는 키리바시 에서 먼저 일어난 다음 나중에 뉴질랜드와 극동 아시아 에서 열립니다 . 몇 시간 후 인도에서 크리스마스가 시작됩니다. 아프리카와 유럽에서 한 시간 더 늦었습니다. 그리고 몇 시간이 지날 때까지 미주 지역에서는 여전히 크리스마스가 아닙니다. 곳 에서 시작되는 크리스마스 는 ZonedDateTime. 모든 곳의 크리스마스 는 LocalDateTime.


java.time 정보

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?


2

또는 java.sql.Timestamp를 사용하십시오. 캘린더가 좀 무거워서 프로덕션 코드에서 사용하지 않는 것이 좋습니다. Joda가 더 좋습니다.

import java.sql.Timestamp;

public class DateTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(new Timestamp(System.currentTimeMillis()));
    }
}

나는 당신이 SQL 타임 스탬프의 질문과 사용을 모두 오해했다고 생각합니다. 일반적으로 new Date()여기서 사용 합니다. 그러나 요청에 따라 어떻게 쉽게 별도의 부품을 얻을 수 있습니까?
BalusC 2010

참고 로 JDBC 4.2 java.sql.Timestamp가 출시되면서 으로 대체되었습니다 java.time.Instant.
Basil Bourque

0

자바 7 캘린더 한 줄

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").format(Calendar.getInstance().getTime())

1
성가신 Calendar 및 SimpleDateFormat 클래스는 이제 구식이며 java.time 클래스로 완전히 대체되었습니다. 최신 접근 방식 은 BalusC의 답변을 참조하십시오 . 대부분의 java.time 기능은 ThreeTen-Backport 프로젝트 에서 Java 6 및 7로 백 포트됩니다 .
Basil Bourque


-2

Calendar now = new Calendar () // or new GregorianCalendar (), 또는 필요한 모든 종류

now.MONTH now.HOUR

기타


3
안녕하세요, 이미 주어진 답변을 잘못된 방식으로 반복하는 이유를 이해하는 데 어려움이 있습니다. 자세히 설명 해주세요 :)
BalusC 2010

3
MONTHHOUR의 정적 상수 Calendar하지 인스턴스 속성은.
Joseph Earl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.