Discuss / Java / 写了一个简单的类来从Epoch Time计算当前北京时间

写了一个简单的类来从Epoch Time计算当前北京时间

Topic source

Tiko_T

#1 Created at ... [Delete] [Delete and Lock User]
public class BeiJingTime {
    private int year;
    private int month;
    private int day;
    private int hour;
    private int min;
    private int sec;
    private int milliSec;
    
    public BeiJingTime(int y, int m, int d, int h, int mi, int s, int ms) {
        year = y;
        month = m;
        day = d;
        hour = h;
        min = mi;
        sec = s;
        milliSec = ms;
    }
    
    @Override
    public String toString() {
        return year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec + "." + milliSec + " GMT+08:00";
    }
    public static BeiJingTime of(long timeMillis) {
        long t = timeMillis;
        long milliSec = t % 1000;
        t = t / 1000; // do not need to accumulate leap seconds
        long day = t / 86400;
        long remind = t % 86400;
        long hour = remind / 3600 + 8; // to UTC+08:00
        long min = (remind % 3600) / 60;
        long sec = remind % 60;
        int from = 1970;
        int count = 0;
        while (day > 0) {
            int curYearDay = 365;
            if (isLeapYear(from + count)) {
                curYearDay = 366;
            }
            if (day - curYearDay < 0) {
                break;
            }
            day -= curYearDay;
            count++;
        }
        int curYear = from + count;
        int curMonth = 1;
        while (day > 0) {
            int curMonthDay = getMonthDay(curYear, curMonth);
            if (day - curMonthDay < 0) {
                break;
            }
            day -= curMonthDay;
            curMonth++;
        }
        day += 1;
        return new BeiJingTime(curYear, curMonth, (int)day, (int)hour, (int)min, (int)sec, (int)milliSec);
    }
    public static Boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    }
    public static int getMonthDay(int year, int month) {
        if (month <= 0 || month > 12) {
            throw new IllegalArgumentException("Unexpected month: " + month);
        }
        int curMonthDay = 30;
        switch (month) {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            curMonthDay = 31;
            break;
        case 2:
            curMonthDay = 28;
            if (isLeapYear(year)) {
                curMonthDay = 29;
            }
            break;
        }
        return curMonthDay;
    }
    
    public static void main(String[] args) throws InterruptedException {
        while (true) {
            Thread.sleep(200);
            System.out.println(BeiJingTime.of(System.currentTimeMillis()));
        }
    }
}


  • 1

Reply