본문 바로가기

IT업무

Unix Time계산하기

회사에서 프로토콜 통신을 위하여 시간데이터는 UTC시간으로 전송한다.


무선통신의 프로토콜이기때문에 패킷의 사이즈가 한정적이었고 이를위해 시간은 전체의 시간을 표시하는것이 아닌 

2020년 1월 1일 00시 00분 00초를 기준으로 Date를 초로 계산을 했다.


때문에 시간에 대한 기준점이 필요했고 Unix Time(UTC 1970년 1월 1일 00시 00분 00초 : 이하 Epoch라 칭함)을 기준잡았다.


2020년 1월 1일 00시 00분 00초의 Epoch는 1577804400000ms 이 나왔다.


이때 아래의 코드로 원하는 Date의 Epoch값을 구할수있다.


// 현재 Epoch long epoch1 = System.currentTimeMillis(); // 원하는 시간 Epoch

long epoch2 = new SimpleDateFormat("yyyyMMddHHmmss").parse("20200101000000").getTime();


System.out.println("epoch : " + epoch + "ms");

System.out.println("epoch2 : " + epoch2 + "ms");


결과

epoch : 1603505896267000ms

epoch2 : 1577804400000000ms


이렇게 Epoch를 구했으니 다시 Date로 변환하는 방법이다.


String date1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (epoch)); String date2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (epoch2));

System.out.println("epoch : " + date1); System.out.println("epoch2 : " + date2);

결과

epoch : 2020/10/24 11:25:12 epoch2 : 2020/01/01 00:00:00


이제 원하는 데이트를 얻기위해 20년 1월 1일 0시0분0초 부터 올라간 시간값에 1577804400000ms 값을 빼주면 원하는 값이 나온다.


아래는 내가 테스트했던 소스...


public static void main(String[] args) throws ParseException {

// 시간 생성 ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC")); ZonedDateTime seoulDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul")); String utc = utcDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); String kst = seoulDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); String localTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); System.out.println("utc : "+utc); System.out.println("kst : "+kst); System.out.println("localTime : " + localTime); // 시간 Epoch계산하기 long utcL = StringDateToIntSecDate(utc, false); long kstL = StringDateToIntSecDate(kst, false); long localTimeL = StringDateToIntSecDate(localTime, false);

// 현재 Epoch long epoch = System.currentTimeMillis();

// 원하는 시간 Epoch long epoch2 = new SimpleDateFormat("yyyyMMddHHmmss").parse("20200101000000").getTime(); long multiple = 1000; System.out.println("utcL : " + utcL); System.out.println("kstL : " + kstL); System.out.println("localTimeL : " + localTimeL); System.out.println("epoch : " + epoch); System.out.println("epoch2 : " + epoch2); // 데이트 변환전 Epoch 시간 계산 utcL = (utcL * multiple) + 1577804400000L; kstL = (kstL * multiple) + 1577804400000L; localTimeL = (localTimeL * multiple) + 1577804400000L; System.out.println("utcL : " + utcL); System.out.println("kstL : " + kstL); System.out.println("localTimeL : " + localTimeL); System.out.println("epoch : " + epoch); System.out.println("epoch2 : " + epoch2); // Epoch 시간계산 값 데이트로 변환 String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (utcL)); String date2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (kstL)); String date3 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (localTimeL)); String date4 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (epoch)); String date5 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date (epoch2)); System.out.println("utc : "+date); System.out.println("kst : "+date2); System.out.println("localTimeL : "+date3); System.out.println("epoch : "+date4); System.out.println("epoch2 : "+date5);

}


public static long StringDateToIntSecDate(String date) {

LocalDateTime dataFormat = stringToDateTime(parseStrDateTime(date), "yyyyMMddHHmmss"); long time = -1; // UTC 2020/01/01 00:00:00 1577804400000 time = (((long) (dataFormat.toEpochSecond(ZoneOffset.UTC) * 1000) - 1577804400000L) / 1000); return time; }



public long StringDateToSec(String date) { long epoch = 0; long epoch2020 = 1577804400000L; long msToSec = 1000L; long sec = 0; try { if(date.length()==12) { epoch = new SimpleDateFormat("yyyyMMddHHmm").parse(date).getTime(); }else if(date.length()==14){ epoch = new SimpleDateFormat("yyyyMMddHHmmss").parse(date).getTime(); } sec = (epoch - epoch2020) / msToSec; } catch (Exception e) { e.printStackTrace(); } return sec; }


public String secToDate(long sec) throws ParseException { long multiple = 1000L; long epoch2020 = 1577804400000L; long epoch = (sec * multiple) + epoch2020; String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date (epoch)); return date; }


최종적으로 내가 원하는 소스는 StringDateToSec메서드를 이용해 2020년 이후의 날짜를 초로 변환시키는 로직이었고 


확인을 위해 secToDate에 변환된 초값을 Date값으로 변환시키는 로직이었다.


나머지는 테스트 소스...