Java로 날짜에 n 시간을 추가 하시겠습니까?


136

Date 객체에 n 시간을 어떻게 추가합니까? StackOverflow에서 일을 사용하는 또 다른 예를 찾았지만 여전히 몇 시간이 걸리는 방법을 이해하지 못합니다.


3
가능하면 joda-time.sourceforge.net을 사용하십시오 .
바바

3
가능하면 Java 8 날짜 및 시간을 사용하십시오 .
peceps

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

답변:


210

캘린더 클래스를 확인하십시오. 그것은이 add시간 조작을 허용하는 방법 (일부 다른 사람을). 이와 같은 것이 작동해야합니다.

    Calendar cal = Calendar.getInstance(); // creates calendar
    cal.setTime(new Date()); // sets calendar time/date
    cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
    cal.getTime(); // returns new date object, one hour in the future

자세한 내용은 API 를 확인하십시오 .


4
일광 절약 시간 / 여름 시간을 다룰 때는 조심하십시오.
CurtainDog

5
말할 것도없이 "부정적인 시간"을 추가 할 수 있습니다
pramodc84

6
@CurtainDog Using Calendar.add()는 자동으로 처리합니다.
Jesper

6
cal.setTime (new Date ())은 필요하지 않습니다. Calendar.getInstance ()의 javadoc는 "반환 된 달력은 기본 시간대의 기본 시간을 기본 로케일로 현재 시간을 기준으로합니다"라고 말합니다.
mithrandir 2014

참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 튜토리얼 오라클 .
Basil Bourque

82

Apache Commons / Lang 을 사용하는 경우 다음을 사용 하여 한 번에 수행 할 수 있습니다 DateUtils.addHours().

Date newDate = DateUtils.addHours(oldDate, 3);

(원래 개체는 변경되지 않습니다)


3
negativ Hours를 사용할 수도 있습니다.DateUtils.addHours(oldDate, -1);
Kaptain

배후에서 이것은 Nikita의 대답과 정확히 일치하지만 매우 간단하고 읽기 쉽습니다. 또한 이미 Apache Commons / Lang을 사용하고 있다면 왜 안됩니까?
Matt

28

@Christopher의 예를 단순화합니다.

상수가 있다고 가정

public static final long HOUR = 3600*1000; // in milli-seconds.

당신은 쓸 수 있습니다.

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Date 객체 대신 long 을 사용 하여 날짜 / 시간을 저장하면

long newDate = oldDate + 2 * HOUR;

26

tl; dr

myJavaUtilDate.toInstant()
              .plusHours( 8 )

또는…

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
              .plus(                      // Do the math, adding a span of time to our moment, our `Instant`. 
                  Duration.ofHours( 8 )   // Specify a span of time unattached to the timeline.
               )                          // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

java.time 사용

Java 8 이상에 내장 된 java.time 프레임 워크는 이전 Java.util.Date/.Calendar 클래스를 대체합니다. 그 오래된 수업은 악명 높았습니다. 피하십시오.

toInstantjava.util.Date에 새로 추가 된 메소드를 사용하여 이전 유형에서 새 java.time 유형으로 변환하십시오. 은 Instant의 타임 라인에 순간 UTC 의 해상도를 가진 나노초 .

Instant instant = myUtilDate.toInstant();

등을 Instant전달하여 시간을 추가 할 수 있습니다 .TemporalAmountDuration

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

해당 날짜-시간을 읽으려면을 호출하여 표준 ISO 8601 형식의 문자열을 생성하십시오 toString.

String output = instantHourLater.toString();

일부 지역의 벽시계 시간 렌즈를 통해 그 순간을보고 싶을 수도 있습니다 . Instant을 만들어 원하는 / 예상 시간대를 조정하십시오 ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

또는 전화 plusHours로 시간 수를 추가 할 수 있습니다. 존이된다는 것은 일광 절약 시간제 (DST)를 의미하며 기타 예외는 귀하를 대신하여 처리됩니다.

ZonedDateTime later = zdt.plusHours( 8 );

당신은을 포함하여 이전 날짜 - 시간 클래스를 사용하지 말아야 java.util.Date하고 .Calendar. 그러나 java.util.Datejava.time 유형에 대해 아직 업데이트되지 않은 클래스와의 상호 운용성 이 정말로 필요한 경우 ZonedDateTimevia 에서 변환하십시오 Instant. 이전 클래스에 추가 된 새로운 메소드는 java.time 유형과의 변환을 용이하게합니다.

java.util.Date date = java.util.Date.from( later.toInstant() );

변환에 대한 자세한 설명은 참조 내 대답 , 질문에를 무엇 "java.time"유형에 java.util.Date를 변환? .


java.time에 대하여

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

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

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

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

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

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


23

Joda-Time 과 함께

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);

2
+1 약간 불필요하지만, 더 많은 날짜 조작을하려는 경우, joda 시간은 훌륭한 라이브러리입니다.
Joeri Hendrickx

3
프로그래머가 날짜에 시간을 추가하는 경우 @JoeriHendrickx, 다음 매우 가능성이 그들은 다른 날짜 - 시간 일을하고 있습니다. 나는 Joda-Time 이 전혀 불필요 하다고 생각하지 않습니다 . 새 프로젝트를 설정할 때 가장 먼저하는 일은 Joda-Time을 추가하는 것입니다. 썬과 오라클조차도 이전 java.util.Date & Calendar를 단계적으로 폐지해야한다는 데 동의했으며, 새로운 java.time. * 패키지 (Joda-Time에서 영감을 얻은)를 Java 8에 추가했습니다.
Basil Bourque

안드로이드에서 Joda에 문제가있었습니다. 계속 받기ClassNotDefinedException
TheRealChx101 17시 39 분

23

자바 8 :

LocalDateTime.now().minusHours(1);

LocalDateTimeAPI를 참조하십시오 .


4
가깝지만 옳지 않습니다. ZonedDateTime대신에 가야 합니다 LocalDateTime. "로컬"수단이 없는 특정 지역에 연결하고 있지 타임 라인에 묶여. "2015 년 12 월 25 일 자정에 크리스마스가 시작됩니다"와 같이, 시간대에 따라 다른 순간이므로 특정 시간대를 적용하여 타임 라인에서 특정 순간을 얻을 때까지 아무런 의미가 없습니다. 또한 표준 시간대가없는 일광 절약 시간 (DST) 및 기타 예외는 LocalDateTime을 사용하여 처리되지 않습니다. 비교하여 내 답변 을 참조하십시오 .
Basil Bourque

1
또한 얻을 java.util.Date요청이 우리에게 물어 봤다으로 개체를 ZonedDateTime.toInstant()하고 Date.from()같은 여기에 설명 stackoverflow.com/a/32274725/5661065
hayduke

16

새로운 java.util.concurrent.TimeUnit 클래스를 사용하면 다음 과 같이 할 수 있습니다

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours

14

다음과 같은 것 :

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours

1
참고로, 같은 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 자바 8 자바 9 페이지에 내장 된 클래스 튜토리얼 오라클 .
Basil Bourque

7

이것은 Date객체가 Datetime 형식 일 때 또 다른 코드 입니다. 이 코드의 장점은 더 많은 시간을 주면 날짜도 그에 따라 업데이트됩니다.

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

출력은 다음과 같습니다.

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014

1
다음을 사용할 수도 있습니다. Calendar cal = Calendar.getInstance ();
Stefan Sprenger

4
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);

4

을 사용하려는 경우 java.timeISO 8601 형식의 지속 시간을 추가하는 방법은 다음과 같습니다.

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  

1
Duration.parse(iso8601duration)감사합니다.하지만 연산자 +를 사용할 수 없습니다 LocalDateTime. 편집하고 싶을 수도 있습니다. 그러나 .plus(...)작동합니다.
qlown

고맙습니다 @ qlown, 나는 +가 groovy에서 작동하고 있다고 생각합니다. 이에 따라 답변을 수정하겠습니다.
Daniel

질문은 DateUTC에 대한 특정 순간을 나타내는 객체 에 관한 것 입니다. 귀하의 사용이 LocalDateTime질문을 해결하지 못합니다. LocalDateTime시간대 또는 UTC에서 오프셋 개념이 없으므로 순간을 나타낼 수 없습니다. 이 문제에 대한 잘못된 수업. Instant와 LocalDateTime의 차이점
Basil Bourque

@BasilBourque Date객체는 더 이상 사용되지 않습니다. 시간대에 관해서는 질문이 모호하므로 내 대답이 유효합니다. 또한, 당신은 그냥 교환 할 수 있습니다 LocalDateTime에 대한 ZonedDateTime.
Daniel

4

Joda DateTime API로 할 수 있습니다

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

첫 번째 줄을 DateTime으로 변경 한 후 작업 dateTime = new DateTime (dateObj);
Sundararaj Govindasamy 2016 년

1

Java 8 클래스를 사용합니다. 아래와 같이 날짜와 시간을 매우 쉽게 조작 할 수 있습니다.

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);

질문은 DateUTC에 대한 특정 순간을 나타내는 객체 에 관한 것 입니다. 귀하의 사용이 LocalDateTime질문을 해결하지 못합니다. LocalDateTime시간대 또는 UTC에서 오프셋 개념이 없으므로 순간을 나타낼 수 없습니다. 이 문제에 대한 잘못된 수업. Instant와 LocalDateTime의 차이점
Basil Bourque

0

Java 8에서 LocalDateTime 클래스를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));

질문은 DateUTC에 대한 특정 순간을 나타내는 객체 에 관한 것 입니다. 귀하의 사용이 LocalDateTime질문을 해결하지 못합니다. LocalDateTime시간대 또는 UTC에서 오프셋 개념이 없으므로 순간을 나타낼 수 없습니다. 이 문제에 대한 잘못된 수업. Instant와 LocalDateTime의 차이점
Basil Bourque

-1

이 방법을 사용할 수 있습니다. 이해하고 구현하기 쉽습니다.

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}

이 접근법은 이미 몇 년 전에 게시 된 다른 답변 에 이미 나와 있습니다. 나는 이것이 어떻게 더 이상 가치를 더하는지 알지 못한다.
Basil Bourque

내 제안의 부가 가치는 단순성과 구현의 용이성입니다. 사용자는 그것을 붙여 넣고 사용하고 시간, 분 또는 초를 추가해야합니다. 알다시피 초보자 수준이 다르며 제안 된 답변이 간단한 답변을 결합하면 고급 답변 감사합니다 :)
Nimpo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.