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()));
}
}
}
Tiko_T