현재 날짜와 시간을 얻는 방법


342

Java에서 현재 날짜와 시간을 얻으려면 어떻게합니까?

DateTime.NowC # 과 동등한 것을 찾고 있습니다.


이 질문은 이전 에 중복으로 표시된 이 질문 보다 낡았습니다 . 그래서 나는이 질문을 다시 열고 새로운 질문을 복제본으로 표시하여 지정을 뒤집 었습니다.
Basil Bourque

답변:


414

Date인수없이 새로운 객체를 만들면됩니다. 현재 날짜와 시간이 새 개체에 할당됩니다.

import java.util.Date;

Date d = new Date();

의 말에 javadoc의 에 대한 제로 인수 생성자 :

Date 객체 를 할당 하고 가장 가까운 밀리 초 단위로 측정 된 시간을 나타내도록 초기화합니다 .

확인 당신이 사용하고 java.util.Date이 아니라 java.sql.Date전혀 다른 대화의 주제입니다 다소 다른 의미를, 후자는 제로 인수 생성자를 가지고 있지 않으며,이 -. :)


13
또한 GregorianCalendar와 많은 유사한 객체가 동일한 방식으로 작동합니다. 따라서 작업하는 날짜 / 달력 개체 유형에 관계없이 인수가없는 생성자는 일반적으로 개체를 현재 날짜 / 시간으로 초기화합니다.
Peter Di Cecco

Date doc에서 : JDK 1.1부터 Calendar 클래스는 날짜와 시간 필드를 변환하는 데 사용되고 DateFormat 클래스는 날짜 문자열을 형식화하고 구문 분석하는 데 사용해야합니다.
Paolo M

9
새로운 Java8 API를 고려하시기 바랍니다 - LocalDateTime.now ()와 ZonedDateTime.now를 ()
올렉 Mikheev를

59

많은 사람들은 Java DateCalendar 클래스를 제대로 설계하지 않은 것으로 간주합니다. Java 내장 날짜 라이브러리 대신 일반적으로 사용되는 라이브러리 인 Joda Time을 살펴보십시오 .

DateTime.NowJoda Time 과 동등한 기능은 다음과 같습니다 .

DateTime dt = new DateTime();

최신 정보

의견에서 언급했듯이 Joda Time의 최신 버전에는 다음과 같은 DateTime.now()방법이 있습니다.

DateTime dt = DateTime.now();

4
Joda의 현재 (2.1) 버전에는 정적 DateTime.now 메서드 ()가있는 것 같습니다 (선택적으로 DateTimeZone 또는 Chronology를 허용합니다). joda-time.sourceforge.net/apidocs/org/joda/time/…
Roman A. Taycher

1
이 답변은 2010 년에 게시되었습니다. Java 8은 Joda Time의 최고 기능 중 다수를 흡수했습니다. 자세한 내용은 공식 문서 및 기타 여러 온라인 기사를 참조하십시오.
DavidS

36

tl; dr

Instant.now()

java.time

java.util.Date 클래스는 Java 8 이상의 새로운 java.time 패키지 ( Tutorial )에 의해 수정되었습니다 . 오래된 java.util.Date/.Calendar 클래스는 매우 번거롭고 혼란스럽고 결함이 있습니다. 피하십시오.

ZonedDateTime

java.time에서 현재 순간을 가져옵니다.

ZonedDateTime now = ZonedDateTime.now();

ZonedDateTime캡슐화 :

시간대를 지정하지 않으면 JVM의 현재 기본 시간대가 자동으로 지정됩니다. 기본적으로 암시 적으로 의존하는 것보다 원하는 / 예상 시간대를 지정하는 것이 좋습니다.

ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = ZonedDateTime.now( z );

UTC

일반적으로 UTC 로 백엔드 작업 (비즈니스 로직, 데이터베이스, 스토리지, 데이터 교환)을하는 습관을들이는 것이 좋습니다. 시간대 . 위의 코드는 JVM의 현재 기본 시간대에 암시 적으로 의존합니다.

Instant클래스는 나노초의 해상도를 가진 UTC의 타임 라인에서 잠시 시간을 나타냅니다.

Instant instant = Instant.now();

Instant클래스는 java.time의 기본 빌딩 블록 클래스이며 코드에서 자주 사용될 수 있습니다.

보다 유연한 형식 지정이 필요하면로 변환하십시오 OffsetDateTime. ZoneOffset객체를 지정하십시오 . UTC의 경우 편리한 상수 상수를 사용하십시오 .

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

시간대

사용자에게 표시 할 다른 시간대로 쉽게 조정할 수 있습니다. 용도 적절한 시간대 이름을 , 결코 같은 3-4 문자 코드 ESTIST.

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

현지화 된 해당 날짜-시간 값의 문자열 표현을 생성하십시오.

String output = DateTimeFormatter
    .ofLocalizedDate( FormatStyle.FULL )
    .withLocale( Locale.CANADA_FRENCH )
    .format ( nowMontreal );

Instant

또는 UTC를 유지하려면을 사용하십시오 Instant. Instant객체는 항상 UTC에, 나노초 해상도로, 타임 라인에 잠시 시간을 나타냅니다. 이는 시간대 지정과 함께 시간 대별 날짜-시간의 빌딩 블록을 제공합니다. 개념적으로 다음과 같이 생각할 수 있습니다.

ZonedDateTime= Instant+ZoneId

당신은 추출 할 수 있습니다 InstantA로부터를 ZonedDateTime.

Instant instantNow = zdt.toInstant();

인스턴트로 시작할 수 있습니다. Instant항상 UTC 와 같이 시간대를 지정할 필요가 없습니다 .

Instant now = Instant.now();

또한 중복 질문에 대한 자세한 내용과 함께 다른 답변 을 게시했습니다 .
Basil Bourque




10

java.lang.System.currentTimeMillis(); 시대 이후 날짜 시간을 반환합니다


로깅에는 좋지만 사용자에게 표시하려면 구문 분석 및 변환이 필요
Rishi Dua

6
import org.joda.time.DateTime;

DateTime now = DateTime.now();

5

새 Date 객체를 만들면 기본적으로 현재 시간으로 설정됩니다.

import java.util.Date;
Date now = new Date();

3

Java는 항상 날짜 및 시간 사용 사례를 부적절하게 지원했습니다. 예를 들어, 기존 클래스 (예 : java.util.DateSimpleDateFormatter)는 스레드로부터 안전하지 않으므로 동시성 문제가 발생할 수 있습니다. 또한 API에는 특정 결함이 있습니다. 예를 들어 연도는 java.util.Date1900 에서 시작하고 월은 1에서 시작하고 일은 0에서 시작합니다. 이러한 문제로 인해와 같은 타사 날짜 및 시간 라이브러리가 인기를 얻었습니다 Joda-Time. 새로운 날짜 및 시간을 해결하기 위해 API는 Java SE 8 용으로 설계되었습니다.

LocalDateTime timePoint = LocalDateTime.now();
System.out.println(timePoint);

당으로 문서 :

이 메서드 now()는 시스템 시계와 기본 시간대 (null 아님)를 사용하여 현재 날짜-시간을 반환합니다 . 기본 시간대의 시스템 시계에서 현재 날짜-시간을 가져옵니다. 현재 시간대를 기본 시간대로 쿼리하여 현재 날짜-시간을 얻습니다. 이 방법을 사용하면 시계가 하드 코딩되어 있기 때문에 테스트를 위해 대체 시계를 사용할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.