Java 自始至终的时间和日期

Java 自始至终的时间和日期,java,Java,我试图写一个程序,只打印当前日期。所以我只需要一年,一个月,一天。我不允许使用任何日期、日历、公历或时间类来获取当前日期。我所能使用的只是System.currentTimeMillis()来获取自epoch以来的当前时间(毫秒),以及java.util.TimeZone.getDefault().getRawOffset()来说明自epoch以来的时区 到目前为止,我尝试的是以毫秒为单位计算当前时间,除以1000得到秒,再除以60得到分钟,再除以60得到小时,依此类推。在我回到1970年1月1

我试图写一个程序,只打印当前日期。所以我只需要一年,一个月,一天。我不允许使用任何日期、日历、公历或时间类来获取当前日期。我所能使用的只是
System.currentTimeMillis()
来获取自epoch以来的当前时间(毫秒),以及
java.util.TimeZone.getDefault().getRawOffset()
来说明自epoch以来的时区

到目前为止,我尝试的是以毫秒为单位计算当前时间,除以1000得到秒,再除以60得到分钟,再除以60得到小时,依此类推。在我回到1970年1月1日以来的18184天之前,它一直运行良好。我不能简单地将天数完全除以30或31,因为并非所有月份都有30或31天。我也找不到年份,因为闰年是365天或364天

class JulianDate {
    static void main() {
        long currentMilli = System.currentTimeMillis() + java.util.TimeZone.getDefault().getRawOffset();
        long seconds = currentMilli / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;
        System.out.println("Days since epoch : "  + days);
    }
}

我需要结束代码来简单地打印
2019年10月15日
2019年10月15日
。格式不重要,我只需要它根据历元毫秒打印当前日期、月份和年份,这里有一个版本供您使用。这使用具有固定天数的4年区块,直到2100年

public static void main(String[] args) {
    // Simple leap year counts, works until 2100
    int[] daysIn4Years = { 365, 365, 366, 365 }; // Starting 1970, 1971, 1972, 1973
    int daysIn4YearsTotal = IntStream.of(daysIn4Years).sum();
    int[][] daysInMonths = {
        { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
        { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }};
    int epochYear = 1970;
    long msIn1Day = 24 * 60 * 60 * 1000L;
    TimeZone timeZone = TimeZone.getDefault();

    long msSinceEpoch = System.currentTimeMillis() + timeZone.getRawOffset();
    int day = (int) (msSinceEpoch / msIn1Day);

    // Get the 4-year block
    int year = ((day / (daysIn4YearsTotal)) * 4) + epochYear;
    day %= daysIn4YearsTotal;

    // Adjust year within the block
    for (int daysInYear : daysIn4Years) {
        if (daysInYear > day) break;
        day -= daysInYear;
        year++;
    }
    boolean leapYear = year % 4 == 0; // simple leap year check < 2100

    // Iterate months
    int month = 0;
    for (int daysInMonth : daysInMonths[leapYear ? 1 : 0]) {
        if (daysInMonth > day) break;
        day -= daysInMonth;
        month++;
    }

    // day is 0..30, month is 0..11
    System.out.printf("%d/%d/%d", month + 1, day + 1, year);
}
publicstaticvoidmain(字符串[]args){
//简单的闰年计算,工作到2100年
int[]daysin4年={365,365,366,365};//从1970年,1971年,1972年,1973年开始
int daysIn4YearsTotal=IntStream.of(daysIn4Years.sum();
int[]daysInMonths={
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }};
int-epochYear=1970;
长MSIN1天=24*60*60*1000L;
时区TimeZone=TimeZone.getDefault();
long mssincepoch=System.currentTimeMillis()+timeZone.getRawOffset();
整数天=(整数)(MSSINCEPOCH/msIn1Day);
//得到4年的积木
整数年=((日/(日自4年累计))*4)+年代;
天%=总共4年内的天;
//调整区块内的年份
用于(整数日/年:日/年){
如果(年>日)休息;
天-=年中的天;
年份++;
}
布尔闰年=年份%4==0;//简单闰年检查<2100
//迭代数月
整月=0;
for(int daysInMonth:daysInMonths[leapYear?1:0]){
如果(月>日)休息;
天-=月内的天;
月份++;
}
//日为0..30,月为0..11
System.out.printf(“%d/%d/%d”,月+1,日+1,年);
}

您是否认为您可能在反向操作?你可以在谷歌上搜索一个公式来确定闰年。然后按365或366块计算1970年1月1日之后的年份(视情况而定)。然后,当您剩余的天数少于一年时,按当月的实际天数计算月份。你总是从1月1日开始工作,所以你知道你要处理的是哪个月,以及这是否是闰年。然后,当你只有不到30天的时间,而不是2月,开始计算每一天。你可能有兴趣阅读以下文章: