Search results for '일자계산'

java 8 DateTime

With Java < 8, you would need to write something like:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) + 2);

vs. with Java 8:

LocalTime now = LocalTime.now();
LocalTime later = now.plus(2, HOURS);

The improvements are essentially on

  • readability:
    • Calendar.getInstance() is not very well named: it is hard to tell which instance you are getting without reading the Javadoc. LocalTime.now() is quite self-describing: you get a time and it is now.
    • To offset a date, you call an offsetting method (plus) whereas with the Calendar API, you have to manually change the fields of the object (in this example, the hour) which is error prone.
  • ease of use (see for example the table towards the bottom of this page for a comparison):
    • the Calendar API is complicated to use because it mixes concepts, such as a simple date (June 26th 2015) and an instant in time (June 26th 2015 at 10am UTC) - there isn't a class for the former concept
    • The new Time API has a clear separation between the various date/time concepts
  • safety:
    • The Calendar API is not safe: nothing prevents you from writing cal.set(123, 2) which would throw a not-so-helpful ArrayOutOfBoundsException. The new API uses enums which solves that problem.
    • The new API uses immutable objects, which makes it thread safe.

Overall, the new API is significantly inspired from jodatime which has been the preferred Java Date API for quite some time now. You can also read this detailed comparison of Java (<1.8) date vs. JodaTime (most of it should apply to the Java 8 Date API).

참고 : http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html

2015/10/28 10:05 2015/10/28 10:05
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

자바 날짜/시간 계산 예제 코드 :: Java Date Code Snippet

update java8 부터는 JodaTime에 기반한 패키지가 포함되어 훨씬 간단하고 쉬운 방법으로 일자관련 기능을 사용할 수있습니다. http://www.yunsobi.com/blog/649

시스템의 밀리초 구하기.(국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각)
[code]
// 밀리초 단위(*1000은 1초), 음수이면 이전 시각
long time = System.currentTimeMillis ( );
System.out.println ( time.toString ( ) );
[/code]

현재 시각을 가져오기.
[code]
Date today = new Date ();
System.out.println ( today );
[/code]
결과 : Sat Jul 12 16:03:00 GMT+01:00 2000

경과시간(초) 구하기
[code]
long time1 = System.currentTimeMillis ();
long time2 = System.currentTimeMillis ();
system.out.println ( ( time2 - time1 ) / 1000.0 );
[/code]

Date를 Calendar로 맵핑하기
[code]
Date d = new Date ( );
Calendar c = Calendar.getInstance ( );
c.setTime ( d );
[/code]

날짜(년/월/일/시/분/초) 구하기
[code] import java.util.*;
import java.text.*;
SimpleDateFormat formatter = new SimpleDateFormat ( "yyyy.MM.dd HH:mm:ss", Locale.KOREA );
Date currentTime = new Date ( );
String dTime = formatter.format ( currentTime );
System.out.println ( dTime ); [/code]

날짜(년/월/일/시/분/초) 구하기2
[code] GregorianCalendar today = new GregorianCalendar ( );
int year = today.get ( today.YEAR );
int month = today.get ( today.MONTH ) + 1;
int yoil = today.get ( today.DAY_OF_MONTH );

GregorianCalendar gc = new GregorianCalendar ( );
System.out.println ( gc.get ( Calendar.YEAR ) );
System.out.println ( String.valueOf ( gc.get ( Calendar.MONTH ) + 1 ) );
System.out.println ( gc.get ( Calendar.DATE ) );
System.out.println ( gc.get ( DAY_OF_MONTH ) ); [/code]

날짜(년/월/일/시/분/초) 구하기3
[code] DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.KOREA);
Calendar cal = Calendar.getInstance(Locale.KOREA);
nal = df.format(cal.getTime()); [/code]

- 표준시간대를 지정하고 날짜를 가져오기.
[code] TimeZone jst = TimeZone.getTimeZone ("JST");
// 주어진 시간대에 맞게 현재 시각으로 초기화된 GregorianCalender 객체를 반환.
Calendar cal = Calendar.getInstance ( jst );  
// 또는
// Calendar now = Calendar.getInstance(Locale.KOREA);
System.out.println ( cal.get ( Calendar.YEAR ) + "년 " + ( cal.get ( Calendar.MONTH ) + 1 ) + "월 " + cal.get ( Calendar.DATE ) + "일 " + cal.get ( Calendar.HOUR_OF_DAY ) + "시 " + cal.get ( Calendar.MINUTE ) + "분 " + cal.get ( Calendar.SECOND ) + "초 " ); [/code]
결과 : 2000년 8월 5일 16시 16분 47초

영어로된 날짜를 숫자로 바꾸기
[code] Date myDate = new Date ( "Sun,5 Dec 1999 00:07:21" );
System.out.println ( myDate.getYear ( ) + "-" + myDate.getMonth ( ) + "-" + myDate.getDay ( ) ); [/code]

"Sun, 5 Dec 1999 00:07:21"를 "1999-12-05"로 바꾸기
[code] SimpleDateFormat formatter_one = new SimpleDateFormat ( "EEE, dd MMM yyyy hh:mm:ss",Locale.ENGLISH );
SimpleDateFormat formatter_two = new SimpleDateFormat ( "yyyy-MM-dd" );
String inString = "Sun, 5 Dec 1999 00:07:21";
ParsePosition pos = new ParsePosition ( 0 );
Date frmTime = formatter_one.parse ( inString, pos );
String outString = formatter_two.format ( frmTime );
System.out.println ( outString ); [/code]

숫자 12자리를, 다시 날짜로 변환하기
[code] Date conFromDate = new Date();
long ttl = conFromDate.parse ( "Dec 25, 1997 10:10:10" );
//예 938291839221
System.out.println ( ttl );  
Date today = new Date ( ttl );
DateFormat format = DateFormat.getDateInstance ( DateFormat.FULL,Locale.US );
String formatted = format.format ( today );
System.out.println ( formatted ); [/code]

특정일로부터 n일 만큼 이동한 날짜 구하기

특정일의 시간을 long형으로 읽어온다음..
날짜*24*60*60*1000 을 계산하여.
long형에 더해줍니다.
그리고 나서 Date클래스와 Calender클래스를 이용해서 날짜와 시간을 구하면 됩니다

특정일에서 일정 기간후의 날짜 구하기2
[code] //iDay 에 입력하신 만큼 빼거나 더한 날짜를 반환 합니다.
import java.util.*;
public String getDate ( int iDay ) {
Calendar temp=Calendar.getInstance ( );
temp.add ( Calendar.DAY_OF_MONTH, iDay );
int nYear = temp.get ( Calendar.YEAR );
int nMonth = temp.get ( Calendar.MONTH ) + 1;
int nDay = temp.get ( Calendar.DAY_OF_MONTH );
StringBuffer sbDate=new StringBuffer ( );
sbDate.append ( nYear );
if ( nMonth < 10 ) sbDate.append ( "0" );
sbDate.append ( nMonth );
if ( nDay < 10 ) sbDate.append ( "0" );
sbDate.append ( nDay );
return sbDate.toString ( );
} [/code]

현재날짜에서 2달전의 날짜를 구하기
[code] //오늘 날짜를 기준으루..
Calendar cal = Calendar.getInstance ( );
//2개월 전....
cal.add ( cal.MONTH, -2 );
System.out.println ( cal.get ( cal.YEAR ) );
System.out.println ( cal.get ( cal.MONTH ) + 1 );
System.out.println ( cal.get ( cal.DATE ) ); [/code]

달에 마지막 날짜 구하기
[code] for ( int month = 1; month <= 12; month++ ) {
GregorianCalendar cld = new GregorianCalendar ( 2001, month - 1, 1 );
System.out.println ( month + "/" + cld.getActualMaximum ( Calendar.DAY_OF_MONTH ) );
} [/code]

해당하는 달의 마지막 일 구하기
[code] GregorianCalendar today = new GregorianCalendar ( );
int maxday = today.getActualMaximum ( ( today.DAY_OF_MONTH ) );
System.out.println ( maxday ); [/code]

특정일을 입력받아 해당 월의 마지막 날짜를 구하는 간단한 예제.(달은 -1 해준다.)...윤달 30일 31일 알아오기.
[code] Calendar cal = Calendar.getInstance ( ); cal.set ( Integer.parseInt ( args[0] ), Integer.parseInt ( args [1] ) - 1, Integer.parseInt ( args [2] ) ); SimpleDateFormat dFormat = new SimpleDateFormat ( "yyyy-MM-dd" ); System.out.println ( "입력 날짜 " + dFormat.format ( cal.getTime ( ) ) ); System.out.println ( "해당 월의 마지막 일자 : " + cal.getActualMaximum ( Calendar.DATE ) ); [/code]

해당월의 실제 날짜수 구하기 ( 1999년 1월달의 실제 날짜수를 구하기 )
[code] Calendar calendar = Calendar.getInstance ( ); calendar.set ( 1999, 0, 1 ); int maxDays = calendar.getActualMaximum ( Calendar.DAY_OF_MONTH ); [/code]

어제 날짜 구하기

오늘날짜를 초단위로 구해서 하루분을 빼주고 다시
셋팅해주면 쉽게 구할수 있죠..
setTime((기준일부터 오늘까지의 초를 구함) - 24*60*60)해주면 되겠죠..

어제 날짜 구하기2
[code] import java.util.*;
public static Date getYesterday ( Date today ) {
if ( today == null ) throw new IllegalStateException ( "today is null" );
Date yesterday = new Date ( );
yesterday.setTime ( today.getTime ( ) - ( (long) 1000 * 60 * 60 * 24 ) );
return yesterday;
} [/code]

내일 날짜 구하기
[code] Date today = new Date ( );
Date tomorrow = new Date ( today.getTime ( ) + (long) ( 1000 * 60 * 60 * 24 ) ); [/code]

내일 날짜 구하기2
[code] Calendar today = Calendar.getInstance ( ); today.add ( Calendar.DATE, 1 ); Date tomorrow = today.getTime ( ); [/code]

오늘날짜에서 5일 이후 날짜를 구하기
[code] Calendar cCal = Calendar.getInstance(); c.add(Calendar.DATE, 5);[/code]

날짜에 해당하는 요일 구하기
[code] //DAY_OF_WEEK리턴값이 일요일(1), 월요일(2), 화요일(3) ~~ 토요일(7)을 반환합니다.
//아래 소스 일부입니다.
import java.util.*;
Calendar cal= Calendar.getInstance ( );
int day_of_week = cal.get ( Calendar.DAY_OF_WEEK );
if ( day_of_week == 1 ) m_week="일요일";
else if ( day_of_week == 2 ) m_week="월요일";
else if ( day_of_week == 3 ) m_week="화요일";
else if ( day_of_week == 4 ) m_week="수요일";
else if ( day_of_week == 5 ) m_week="목요일";
else if ( day_of_week == 6 ) m_week="금요일";
else if ( day_of_week == 7 ) m_week="토요일"; [/code]

콤보박스로 선택된 날짜(예:20001023)를 통해 요일을 영문으로 가져오기
[code] //gc.get(gc.DAY_OF_WEEK); 하면 일요일=1, 월요일=2, ..., 토요일=7이 나오니까,
//요일을 배열로 만들어서 뽑아내면 되겠죠.
GregorianCalendar gc=new GregorianCalendar ( 2000, 10 - 1 , 23 );
String [] dayOfWeek = { "", "Sun", "Mon", .... , "Sat" };
String yo_il = dayOfWeek ( gc.get ( gc.DAY_OF_WEEK ) ); [/code]

두 날짜의 차이를 일수로 구하기

각각의 날짜를 Date형으로 만들어서 getTime()하면
long으로 값이 나오거든요(1970년 1월 1일 이후-맞던가?- 1/1000 초 단위로..)
그러면 이값의 차를 구해서요. (1000*60*60*24)로 나누어 보면 되겠죠.

두 날짜의 차이를 일수로 구하기2
[code] import java.io.*;
import java.util.*;
Date today = new Date ( );
Calendar cal = Calendar.getInstance ( );
// 오늘로 설정.
cal.setTime ( today );  
Calendar cal2 = Calendar.getInstance ( );
// 기준일로 설정. month의 경우 해당월수-1을 해줍니다.
cal2.set ( 2000, 3, 12 );  
int count = 0;
while ( !cal2.after ( cal ) ) {
count++;
//다음날로 바뀜
cal2.add ( Calendar.DATE, 1 );  
System.out.println ( cal2.get ( Calendar.YEAR ) + "년 " + ( cal2.get ( Calendar.MONTH ) + 1 ) + "월 " + cal2.get ( Calendar.DATE ) + "일" );
}
System.out.println ( "기준일로부터 " + count + "일이 지났습니다." ); [/code]

두 날짜의 차이를 일수로 구하기3
[code] import java.io.*;
import java.util.*;
public class DateDiff {
public static int GetDifferenceOfDate ( int nYear1, int nMonth1, int nDate1, int nYear2, int nMonth2, int nDate2 ) {
Calendar cal = Calendar.getInstance ( );
int nTotalDate1 = 0, nTotalDate2 = 0, nDiffOfYear = 0, nDiffOfDay = 0;

if ( nYear1 > nYear2 ) {
for ( int i = nYear2; i < nYear1; i++ ) {
cal.set ( i, 12, 0 ); nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate1 += nDiffOfYear;
} else if ( nYear1 < nYear2 ) {
for ( int i = nYear1; i < nYear2; i++ ) {
cal.set ( i, 12, 0 );
nDiffOfYear += cal.get ( Calendar.DAY_OF_YEAR );
}
nTotalDate2 += nDiffOfYear;
}
cal.set ( nYear1, nMonth1-1, nDate1 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate1 += nDiffOfDay;
cal.set ( nYear2, nMonth2-1, nDate2 );
nDiffOfDay = cal.get ( Calendar.DAY_OF_YEAR );
nTotalDate2 += nDiffOfDay;
return nTotalDate1-nTotalDate2;
}
public static void main ( String args[] ) {
System.out.println ( "" + GetDifferenceOfDate (2000, 6, 15, 1999, 8, 23 ) );
}
} [/code]

파일에서 날짜정보를 가져오기
[code] File f = new File ( directory, file );
Date date = new Date ( f.lastModified ( ) );
Calendar cal = Calendar.getInstance ( );
cal.setTime ( date );
System.out.println("Year : " + cal.get(Calendar.YEAR));
System.out.println("Month : " + (cal.get(Calendar.MONTH) + 1));
System.out.println("Day : " + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("Hours : " + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("Minutes : " + cal.get(Calendar.MINUTE));
System.out.println("Second : " + cal.get(Calendar.SECOND)); [/code]

날짜형식으로 2000-01-03으로 처음에 인식을 시킨후
7일씩 증가해서 1년정도의 날짜를 출력해 주고 싶은데요.
[code] SimpleDateFormat sdf = new SimpleDateFormat ( "yyyy-mm-dd" );
Calendar c = Calendar.getInstance ( );
for ( int i = 0; i < 48; i++ ) {
c.clear ( ); c.set ( 2000, 1, 3 - ( i * 7 ) );
java.util.Date d = c.getTime ( );
String thedate = sdf.format ( d );
System.out.println ( thedate );
} [/code]

쓰레드에서 날짜 바꾸면 죽는 문제

Main화면에 날짜와시간이Display되는 JPanel이 있습니다.
date로 날짜와 시간을 변경하면 Main화면의 날짜와 시간이 Display되는 Panel에
변경된 날짜가 Display되지 않고 Main화면이 종료되어 버립니다.

문제소스:
[code] public void run ( ) {
while ( true ) {
try{
timer.sleep ( 60000 );
} catch ( InterruptedException ex ) { }
lblTimeDate.setText ( fGetDateTime ( ) );
repaint ( );
}
}

public String fGetDateTime ( ) {
final int millisPerHour = 60 * 60 * 1000;
String DATE_FORMAT = "yyyy / MM / dd HH:mm";

SimpleDateFormat sdf = new SimpleDateFormat ( DATE_FORMAT );
SimpleTimeZone timeZone = new SimpleTimeZone ( 9 * millisPerHour, "KST" );
sdf.setTimeZone ( timeZone );
long time = System.currentTimeMillis ( );
Date date = new Date ( time );
return sdf.format ( date );
} [/code]

해답:
[code] // 날짜와 요일 구한다. timezone 으로 날짜를 다시 셋팅하시면 됨니다.
public String getDate ( ) {
Date now = new Date ( );
SimpleDateFormat sdf4 = new SimpleDateFormat ( "yyyy/MM/dd HH:mm EE" );
sdf4.setTimeZone ( TimeZone.getTimeZone ( "Asia/Seoul" ) );
return sdf4.format ( now );
} [/code]

날짜와 시간이 유효한지 검사하려면...?
[code] import java.util.*;
import java.text.*;
public class DateCheck {
boolean dateValidity = true;
DateCheck ( String dt ) {
try {
DateFormat df = DateFormat.getDateInstance ( DateFormat.SHORT );
df.setLenient ( false );
Date dt2 = df.parse ( dt );
} catch ( ParseException e ) {
this.dateValidity = false;
} catch ( IllegalArgumentException e ) {
this.dateValidity = false;
}
}

public boolean datevalid ( ) {
return dateValidity;
}

public static void main ( String args [] ) {
DateCheck dc = new DateCheck ( "2001-02-28" );
System.out.println ( " 유효한 날짜 : " + dc.datevalid ( ) );
}
} [/code]

두 날짜 비교하기(아래보다 정확)

그냥 날짜 두개를 long(밀리 세컨드)형으로 비교하시면 됩니다...

이전의 데이타가 date형으로 되어 있다면, 이걸 long형으로 변환하고.
현재 날짜(시간)은 System.currentTimeMillis()메소드로 읽어들이고,
두수(long형)를 연산하여 그 결과 값으로 비교를 하시면 됩니다.

만약 그 결과값이 몇시간 혹은 며칠차이가 있는지를 계산할려면,
결과값을 Calender의 setTimeInMillis(long millis) 메소드를 이용해
설정한다음 각각의 날짜나 시간을 읽어오시면 됩니다

두 날짜 비교하기2
[code] import java.util.*;
import java.util.Calendar.*;
import java.text.SimpleDateFormat;
public class DayComparisonTest {
public static void main(String args[]) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat dateForm = new SimpleDateFormat("yyyy-MM-dd");
Calendar aDate = Calendar.getInstance();
// 비교하고자 하는 임의의 날짜
aDate.set(2001, 0, 1);
// 시스템 일시
Calendar bDate = Calendar.getInstance();
// 여기에 시,분,초를 0으로 세팅해야 before, after를 제대로 비교함
aDate.set( Calendar.HOUR_OF_DAY, 0 );
aDate.set( Calendar.MINUTE, 0 );
aDate.set( Calendar.SECOND, 0 );
aDate.set( Calendar.MILLISECOND, 0 );
bDate.set( Calendar.HOUR_OF_DAY, 0 );
bDate.set( Calendar.MINUTE, 0 );
bDate.set( Calendar.SECOND, 0 );
bDate.set( Calendar.MILLISECOND, 0 );
if (aDate.after(bDate)) // aDate가 bDate보다 클 경우 출력
System.out.println("시스템 날짜보다 뒤일 경우 aDate = " + dateForm.format(aDate.getTime()));
else if (aDate.before(bDate)) // aDate가 bDate보다 작을 경우 출력
System.out.println("시스템 날짜보다 앞일 경우 aDate = " + dateForm.format(aDate.getTime()));
else // aDate = bDate인 경우
System.out.println("같은 날이구만");
}
} [/code]

2008/02/26 11:13 2008/02/26 11:13
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 2010/07/02 17:36
    자바/ 시간 날짜 예제 Tracked from Make me Funny
  1. Blog Icon
    난학생

    찾고 있던 자료인데 감사해요 ^^

  2. Blog Icon
    DKdak

    아이고.. 한참 찾았는데.. 감사합니다.

  3. Blog Icon
    임진우

    유용한 정보 고맙습니다.

    퍼가겠습니다.

  4. Blog Icon
    최경렬

    시간 차이값을 조사하려고 검색 했는데 필요했던 것보다 더 정리를 잘 해 주셨네요.
    감사합니다.
    담아가겠습니다.

  5. Blog Icon
    JW

    깔끔한 정리 감사합니다.
    담아갈께요~

  6. Blog Icon
    정연규

    좋은 정보 감사합니다.
    출처남기고 담아가겠습니다~

  7. Blog Icon
    전병태

    정보 감사합니다.
    출처 남기고 담아가겠습니다.

  8. 잘 정리된 정보 감사합니다.
    D-Day 기능을 구현하고 있었는데 여기에 딱 있네요.

  9. 정말 좋은 정보 감사합니다.
    출처를 명시하고 퍼가겠습니다.
    다시한번 감사드립니다.

  10. Blog Icon
    sdafasdf

    아 ㅡㅡ 패키지 임포트 왜 빼놔요? ㅄ같네

  11. Blog Icon
    ㅋㅋㅋ

    병신은 님 아닌가요?

  12. Blog Icon
    ㄷㄷ

    코딩 한번이라도 제대로 해보신분이긴 한건지;
    그정돈 기본으로 하실 줄 알아야죠

  13. Blog Icon
    쯧쯧

    지금 공부나 제대로 하실지, 일이나 제대로 하고 계실지...... 수준이 보이네요 쯧쯧.. 나중에 마주치지 않기를 바랄 뿐입니다

  14. Blog Icon

    밥은 드시고 다니시나요???

  15. Blog Icon
    개발자

    와~~~ 정리 잘되어있네요 .. 감사합니다^^

  16. Blog Icon
    나같은사람

    정말 아주 아주 좋은정보 감사 함니다.
    이런 자료많이 올려주시면 감사하겠습니다.
    잘쓰겠습니다

  17. Blog Icon
    허어얼

    정리가 넘 잘되었네요 굿굿

  18. Blog Icon
    민경우

    정말 감사합니다 안드로이드 하나도 모르는데 이런 꿀같은 정보가...

  19. Blog Icon
    배우는자

    안녕하세요 요즘 자바 그레고리아 켈린더 함수 배우는 학생인데요

    그 5일뒤 소스를 제가 그대로 적용 시켜봤는데 뭔가 에러가 나더라구요..

    염치없지만.. 제가 이유를 좀 알고싶은데 혹시 가르쳐주실수 있으신가여

  20. Blog Icon
    배우는자

    아 에러 잡았습니다 소스 감사합니다.

  21. Blog Icon
    김정식

    너무 유용하게 잘 봤습니다.^^

  22. Blog Icon
    감사합니다

    감사합니다!!

  23. 잘 보고 베껴 갑니다.
    함께 보려고
    http://blog.daum.net/andro_java/181
    페이지에 올렸습니다.

  24. Blog Icon

    감사합니다. 잘 보고 갑니다