티스토리 뷰

Java8 LocalDateTime을 비롯해 여러가지 시간을 처리하는 클래스들을 쓰면서 나오는 경우를 정리 해보았습니다.

 

Git Repository

Kyeongrok/java-datetime-examples (github.com)

 

 

1.년월일 시분초 지정해서 LocalDateTime생성하기

LocalDateTime now = LocalDateTime.now();
LocalDateTime ldt = LocalDateTime.of(now.getYear(),
now.getMonth(), now.getDayOfMonth(), now.getHour(), 0, 0);

LocalDateTime.of()를 쓰면 년월일 시분초를 직접 지정 할 수 있습니다.
위 코드는 분, 초는 0으로 설정하는 코드입니다.

 

결과

2022-04-03T12:00

 

2.yyyy-mm-dd hh:mm:ss형식의 String을 LocalDateTime으로 바꾸기

String으로 되어 있는 날짜와 시간을 LocalDateTime오브젝트로 파싱할때 아래와 같이 DateTimeFormatter.ofPattern()을 씁니다.

LocalDateTime d = LocalDateTime.parse("2016-10-31 23:59:59", 
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

결과

2016-10-31T23:59:59

 

 

3.Java Date + Time으로 LocalDateTime 만들고 비교하기

public class DatetimeExamples03 {

    private static boolean checkDateTime(Date date, LocalTime lt){
        LocalDateTime localDateTimeGameUntil = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).with(lt);

        LocalDateTime localDateTimeNow = LocalDateTime.now();
        return localDateTimeNow.isBefore(localDateTimeGameUntil);
    }

    public static void main(String[] args) {
        //3.Java Date + LocalTime으로 LocalDateTime 만들고 비교하기
        Calendar calendar = Calendar.getInstance();
        Date date = calendar.getTime();

        System.out.println(checkDateTime(date, LocalTime.now()));
    }
}

db를 date와 time을 구분을 해놓은 경우 이렇게 사용했습니다. 가장 좋은 방법은 db컬럼을 datetime으로 만드는게 좋은 것 같습니다.

 

결과

false

 

 

4.정규식으로 특정 시간대 패턴

12시 20분대
12:[2-9][0-9]:[0-9]{2}
11시 40~50분대
11:[4-5][0-9]:[0-9]{2}
12시 22분대, 12시 32분대
12:[2-5][2-3]:[0-9]{2}
17시 22분대, 12시 32분대
17:[2-5][2-3]:[0-9]{2}

 

5.Java8 LocalDate, LocalDateTime 날짜 dateformat 예제

날짜 처리 할 때 yyyy-MM-dd 이렇게 2018-08-04 이렇게 월, 일에 자릿수가 1자리면 앞에 0을 붙히는 포맷으로 할 때 월은 "MM"으로 하고 일은 "dd"로 쓰면 포메팅 할 수 있습니다.

 

 

public static void getFullYearMonth(String dateString) {
    // 대상 날짜로 LocalDateTime 만들기
    LocalDateTime parsedLocalDateTime = LocalDateTime.parse(dateString);

    // LocalDateTime에서 필요한 내용 필요한 형식으로 뽑기
    String yyyyMMdd = parsedLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
    String yyyy = parsedLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy"));
    String MM = parsedLocalDateTime.format(DateTimeFormatter.ofPattern("MM"));

    System.out.println(yyyyMMdd);
    System.out.println(yyyy);
    System.out.println(MM);

    System.out.println("---------------");

    String yyMd = parsedLocalDateTime.format(DateTimeFormatter.ofPattern("yy-M-d"));
    String yy = parsedLocalDateTime.format(DateTimeFormatter.ofPattern("yy"));
    String M = parsedLocalDateTime.format(DateTimeFormatter.ofPattern("M"));

    System.out.println(yyMd);
    System.out.println(yy);
    System.out.println(M);
}

public static void main(String[] args) {
    getFullYearMonth("2018-08-04T10:11:30");
}

결과

2018-08-04
2018
08
---------------
18-8-4
18
8

 

6.yyyy-mm-dd HH:mm:ss 형식을 Java Data Object로 바꿀 때

LocalDateTime말고 Date로 바꾸고 싶을 때 이 방법을 씁니다.

Date startDatetime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2017-05-31 11:00:00");

8.yyyy-mm-dd 형식을 Java Data Object로 바꿀 때

Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse("2017-05-25");

9.yyyy,MM,dd,HH,mm,s 형식을 Java Data Object로 바꿀 때

Date startDatetime = new SimpleDateFormat("yyyy,MM,dd,HH,mm,s").parse("2017,05,29,17,00,0");
String to Date and Date to String
SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd");
Date convertedCurrentDate = sdf.parse("2013-09-18");
String date=sdf.format(convertedCurrentDate );
System.out.println(date);

http://stackoverflow.com/questions/18873014/parse-string-date-in-yyyy-mm-dd-format

String createdAt = "2018-03-29T16:44:46.211Z";
LocalDateTime d = LocalDateTime.parse(createdAt,
                DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));

Timestamp timestamp = Timestamp.valueOf(d);

ISO8601 시간 바꾸기

 

10. Java LocalDateTime 어제 00:00:00 ~ 오늘 23:59:59 만들기

LocalDateTime startDatetime = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.of(0,0,0)); //어제 00:00:00
LocalDateTime endDatetime = LocalDateTime.of(LocalDate.now(), LocalTime.of(23,59,59)); //오늘 24:00:00

아래 과정을 거쳐 어제 00:00:00을 만들 수 있습니다.

  • LocalDateTime.now()로 현재 시간을 만듭니다.
  • LocalDateTime.of()에 .minusDays(1)을 해서 하루를 빼면 어제가 나옵니다.
  • LocalTime.of(0,0,0)으로 00:00:00을 만듭니다.
  • LocalDateTime.of(date, time)으로 LocalDateTime을 생성합니다.
  • 오늘도 마찬가지로 생성하면 됩니다.

11.Java8 UTC날짜 스트링을 Asia/Seoul로 바꾸기

ZoneId utcZone = ZoneId.of("UTC");

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse("2017-09-07 11:00:00", formatter);
ZonedDateTime utcDateTime = dateTime.atZone(utcZone);
System.out.println("utcDateTime = " + utcDateTime);

ZonedDateTime zdt = utcDateTime.withZoneSameInstant(ZoneId.of("Asia/Seoul"));
String date = zdt.format(DateTimeFormatter.ISO_LOCAL_DATE);
String time = zdt.format(DateTimeFormatter.ISO_LOCAL_TIME);

System.out.println(zdt);
System.out.println(date);
System.out.println(time);

Date date1 = Date.from(zdt.toInstant());
System.out.println(date1);

크롤링을 해서 파싱을 하다보면 날짜가 오긴 오는데 UTC로 오는 경우가 있습니다. UTC를 KST로 시간대를 변경 해주어야 할때가 있습니다.

이럴때 자바8에서 새로 나온 기능인 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 등을 이용하면 비교적 짜임새 있게 날짜를 컨트롤 할 수 있습니다.

예를들면 썸머타임등을 따로 처리 하지 않아도 알아서 처리를 해주는 등이 편한 기능입니다.

인터넷에 예제를 찾아보니까 Date, Calendar 등의 객체를 이용한 예제들이 있는데 적용하려면 복잡할 때가 있었습니다. ZoneId를 쓰면 비교적 깔끔하게 바뀝니다.

12.오늘, 30일후 yyyy-MM-dd로 생성

//오늘, 앞으로 30일

Calendar startCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
endCalendar.add(Calendar.MONTH, 1);

String pattern = "yyyy-MM-dd";
String sStartDate = getCalendarString(startCalendar, pattern);
String sEndDate = getCalendarString(endCalendar, pattern);
private String getCalendarString(Calendar calendar, String pattern) {
    SimpleDateFormat format = new SimpleDateFormat(pattern);
    return format.format(calendar.getTime());
}

 

13.Java UTC를 local Time(GMT +9)로 변경

//utc 를 gmt +9로 변경 해준다.
TimeZone utc = TimeZone.getTimeZone("UTC");
TimeZone seoul = TimeZone.getTimeZone("Asia/Seoul");
Calendar calendar = Calendar.getInstance(utc);
calendar.set(eventNode.get("startDate").get(1).get("year").asInt()
        , eventNode.get("startDate").get(1).get("month").asInt() - 1
        , eventNode.get("startDate").get(1).get("date").asInt()
        , eventNode.get("startDate").get(1).get("hour").asInt()
        , eventNode.get("startDate").get(1).get("minute").asInt()
        ,0);

String pattern_date = "yyyy-MM-dd";
String pattern_time = "HH:mm:ss";

String localDate = toString(calendar, pattern_date, seoul);

String localTime = toString(calendar, pattern_time, seoul);

14.시간 round하기

아래 코드는 15분 간격으로 분을 설정하는 코드입니다.

@Test
public void round() {
    LocalDateTime time = LocalDateTime.now();
    LocalDateTime lastQuarter = time.truncatedTo(ChronoUnit.HOURS)
            .plusMinutes(15 * (time.getMinute() / 15));
    System.out.println(lastQuarter);
}

###시간 정리하기

@Test
public void truncate() {
    // minute이 60보다 크면
    int minute = 3600 * 24;
    LocalDateTime time = LocalDateTime.now();
    LocalDateTime lastQuarter = time.truncatedTo(ChronoUnit.HOURS)
            .plusMinutes(minute * (time.getMinute() / minute));

    System.out.println(time.truncatedTo(ChronoUnit.HOURS));
    System.out.println(time.truncatedTo(ChronoUnit.DAYS));
    System.out.println(lastQuarter);
    // 2019-01-02 00:00:01 -> 2019-01-02 00:00:00
    // 2019-01-02 23:59:01 -> 2019-01-02 00:00:00
}

결과

2019-01-09T17:002019-01-09T00:002019-01-09T17:00

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함