看了这些已经存在的回答,真的是无Fu*k说,觉得无聊呢可以不回答啊。
既然你问了这个问题,证明你是个编程方面的新手,但是我很鼓励你有这种想法,因为我曾经也有过类似的想法。这个问题本身并不是很难,只不过要达到类似于库函数那样效果的话考虑的东西比较多,下面我用比较简单的方式实现一个MyDateTime类,该类提供一个从时间戳获取MyDateTime对象的静态方法fromTimestamp,逻辑比较简单,不考虑时区,即转换得到的时间还是格林威治时间。
开始之前需要说明的是本人不是专业的Java开发者,Java只是大概看过一些,所以就不要挑剔代码写的怎么样了,程序思想最重要不是么?
import java.util.function.Function;
public class MyDateTime {
private int year;
private int month;
private int day;
private int hour;
private int minute;
private int second;
public int getYearValue(){
return year;
}
public int getMonthValue(){
return month;
}
public int getDayValue(){
return day;
}
public int getHourValue(){
return hour;
}
public int getMinuteValue(){
return minute;
}
public int getSecondValue(){
return second;
}
@Override
public String toString() {
return String.format("%d/%d/%d-%d:%d:%d", year,month,day,hour,minute,second);
}
public static MyDateTime fromTimestamp(long timeStamp){
MyDateTime dt = new MyDateTime();
long minutes = timeStamp / 60;
dt.second = (int)(timeStamp % 60);
long hours = minutes / 60;
dt.minute = (int)(minutes % 60);
long days = hours / 24;
dt.hour = (int)(hours % 24);
Function isLeapYear = y -> (y % 4 == 0 && y % 100 != 0) || y %400 == 0;
//年份累计
int year = 1970;
long restDays = days;
while(true){
int daysOfYear = isLeapYear.apply(year)? 366 : 365;
if(restDays
break;
}
restDays -= daysOfYear;
year++;
}
dt.year = year;
int[] daysOfMonth = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
daysOfMonth[1] = isLeapYear.apply(dt.year)? 29 : 28;
for(int i=0; i < daysOfMonth.length; i++){
if(restDays < daysOfMonth[i]){
dt.month = i + 1;
break;
}
restDays -= daysOfMonth[i];
}
dt.day = (int)restDays;
if(dt.hour>0 || dt.minute>0 || dt.second>0){
//多出来的一天
dt.day += 1;
}
return dt;
}
}
最后要说的是有想法是好的,但还是建议多了解语言配套的生态,用起来才能更得心应手。