자바 날짜를 한 시간 뒤로 변경


124

Java 날짜 개체가 있습니다.

Date currentDate = new Date();

이것은 현재 날짜와 시간을 제공합니다. 예:

Thu Jan 12 10:17:47 GMT 2012

대신 날짜를 가져 와서 한 시간 뒤로 변경하여 다음을 제공해야합니다.

Thu Jan 12 09:17:47 GMT 2012

이를 수행하는 가장 좋은 방법은 무엇입니까?


mktime자바에 상응하는 것이 있습니까? 여기서 60 분을 빼겠습니까?
Shiplu Mokaddim

답변:


243

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

자바 8 : java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

자바 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));

8
12 시간 시계와 Calendar.HOUR_OF_DAY가 24 시간 시계와 함께 작동하는 Calendar.HOUR가 있다는 사실 만 다양합니다. chintat.blogspot.ca/2006/05/…
Wolf

시간이 하루 자정이고 전날 오후 11 시인 한 시간 일찍 캘린더를 사용하려는 경우 캘린더의 첫 번째 솔루션이 작동할까요?
George Arokiam 2018 년

1
@GeorgeArokiam 예는 것
키미

66

@Sumit Jain의 솔루션과 유사

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

또는

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3
더 나은 솔루션. 캘린더 인스턴스 생성은이 특정 애플리케이션에서 과잉처럼 보입니다.
www.Decompiler.com

2
@cosmolev 캘린더는 내가 찾은 대부분의 예에서 과잉입니다.
Peter Lawrey

2
@Stoan 더 읽기 쉬운 예제를 추가했습니다. 캘린더는 매우 비효율적입니다.
Peter Lawrey

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); 이게 10 분 늦어 야하나요?
Siya Sosibo

15

tl; dr

에서 UTC :

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

또는 구역화 :

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

java.time 사용

Java 8 이상에는 새로운 java.time 프레임 워크가 내장되어 있습니다.

Instant

UTC (GMT)에만 관심이 있다면 Instant클래스 를 사용하십시오 .

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

콘솔에 덤프합니다.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

인스턴트 : 2015-10-29T00 : 37 : 48.921Z | instantHourEarlier : 2015-10-28T23 : 37 : 48.921Z

이 순간에 어제 날짜로 건너 뛰는 방법에 유의하십시오.

ZonedDateTime

시간대에 관심이 있다면 ZonedDateTime수업을 사용하십시오 . 인스턴트로 시작하여 시간대, ZoneId객체를 할당 할 수 있습니다 . 이 클래스는 일광 절약 시간 (DST) 과 같은 이상 항목에 필요한 조정을 처리합니다 .

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

콘솔에 덤프합니다.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

즉시 : 2015-10-29T00 : 50 : 30.778Z

zdt : 2015-10-28T20 : 50 : 30.778-04 : 00 [미주 / 몬트리올]

zdtHourEarlier : 2015-10-28T19 : 50 : 30.778-04 : 00 [미주 / 몬트리올]

변환

이전 java.util.Date/.Calendar 클래스는 이제 구식입니다. 그들을 피하십시오. 그들은 악명 높고 혼란 스럽습니다.

java.time 유형에 대해 아직 업데이트되지 않은 이전 코드로 작동하기 위해 이전 클래스를 사용해야하는 경우 변환 메소드를 호출하십시오. 다음은 Instant 또는 ZonedDateTime에서 java.util.Date로 이동하는 예제 코드입니다.

java.util.Date date = java.util.Date.from( instant );

…또는…

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

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 클래스는 어디서 구할 수 있습니까?

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


안녕하세요, 저는 여전히 인스턴트의 "시간 전"을 만드는 적절한 방법을 찾을 수 없습니다.
Ticherhaz

9

캘린더를 사용 합니다.

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);

7

또는 유명한 Joda Time 라이브러리 사용 :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

5

날짜에서 시간당 밀리 초 수를 빼면됩니다.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));


4

다음 코드에서 날짜와 시간을 사용할 수 있습니다.

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

출력 :

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

이 링크는 좋습니다 : 여기를 참조하십시오

그리고 참조 : 참조

그리고 : 여기

그리고 : 여기

그리고 : 여기

시간이 필요한 경우 :

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

2
참고 :이 답변은 현대 java.time 클래스로 대체 된 현재 레거시 인 성가신 오래된 Date-time 클래스를 사용합니다.
Basil Bourque

0

이것은 java.util.Date. 다음 코드는 날짜에서 1 시간을 뺍니다.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

날짜에서 20 초를 빼는 것과 비슷합니다.

newDate = DateUtils.addSeconds(date, -20)    

-1

밀리 초 단위에서 분을 뺀 시간을 밀리 초 단위로 가져와 날짜로 변환합니다. 여기에서 하나를 객관화해야합니다 !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);

@Makky : 나는 상황이 바뀌 었다는 것을 안다. 그러나 그것은 잘못된 대답이 아닙니다! 왜 이것이 틀린 답을 말합니까? 받아 들여진 대답을 완전히 보았습니까?
Zenith

1
왜 당신은 5 년 전이고 대답을 받아 들인 질문에 대답을하겠습니까?
Makky

이 답변은 기존 답변보다 가치가 없습니다. 그리고이 답변은 java.time 클래스에 의해 수년 동안 대체 된 끔찍한 오래된 날짜 시간 클래스를 현명하게 사용하지 않습니다. 또 다른 문제 :이 답변은 시간대 문제를 무시하고 질문이 GMT / UTC를 요청하는 동안 JVM의 현재 기본 시간대를 사용하는 코드를 보여줍니다. Kimi정확한 답변 의 뒷부분을 참조 하거나 자세한 내용은 내 답변 을 참조하십시오 .
Basil Bourque

-1

대신 format. 시간을 사용하려면 parse 및 toString () 메서드를 사용하십시오.

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (로컬 타임)

LocalTime lt = 6:11; localTime = lt.toString ()


1
이 답변은 질문을 다루지 않습니다. 질문은 하루 중 시간 이상에 관한 것입니다.
Basil Bourque
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.