有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

日期在java中将时间戳转换为特定格式(年、月、周、天、时间、小时、分钟和秒)

这是我的密码

例如,2年、2个月、1周、2天、1小时、2分钟、35秒

    String stdate ="01/01/2014 09:30:30";
    String endate ="09/11/2015 11:30:30";
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
    Date d1 = new Date();
    Date d2 = new Date();
    long year =(1000*60*60*24*365l);
    long month =(1000*60*60*24*30l);
    long weeks =(1000*60*60*24*7l);
    long days =(1000*60*60*24l);

    try{

        d1 = df.parse(stdate);
        d2 = df.parse(endate);
        long diff = d2.getTime()-d1.getTime();
        long diffYear = diff/(1000*60*60*24*365l);
        long diffMonth = (diff-(diffYear*year))/month;
        long diffWeeks = ((diff%month))/weeks;
        long diffDays = ((diff%weeks))/days;

        System.out.println(diffYear+" years  ");
        System.out.println(diffMonth+" months ");
        System.out.println(diffWeeks+" week ");
        System.out.println(diffDays+" days "); // wrong output,
    }catch(Exception e){

    }

o/p:

1年
10个月
2周
5天

我不想利用乔达的时间。它应该在java中。util.*

请回答,提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    你可以尝试从Joda-time使用Period

    String stdate = "01/01/2014 09:30:30";
    String endate = "09/11/2015 11:30:30";
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
    Date d1 = df.parse(stdate);
    Date d2 = df.parse(endate);;
    
    DateTime startTime = new DateTime(d1), endTime = new DateTime(d2);
    Period p = new Period(startTime, endTime);
    System.out.printf("%-8s %d %n","years:",p.getYears());
    System.out.printf("%-8s %d %n","months:",p.getMonths());
    System.out.printf("%-8s %d %n","weeks:",p.getWeeks());
    System.out.printf("%-8s %d %n","days:",p.getDays());
    System.out.printf("%-8s %d %n","hours:",p.getHours());
    System.out.printf("%-8s %d %n","minutes:",p.getMinutes());
    System.out.printf("%-8s %d %n","second:",p.getSeconds());
    

    输出:

    years:   1 
    months:  10 
    weeks:   1 
    days:    1 
    hours:   2 
    minutes: 0 
    second:  0 
    

    更新:

    回答你最初的问题:就像你从diff中减去已经属于year的天数来计算月份一样,你需要减去

    • yearmonth上用于计算weeks的天数之和
    • 如果要计算days,则已属于年、月、周的天数总和

    所以你的代码看起来像

    long diffYear = diff / year;
    long diffMonth = (diff - (diffYear * year)) / month;
    //long diffWeeks= ((diff % month)) / weeks;
    long diffWeeks = (diff - (diffYear * year + diffMonth * month)) / weeks;
    //long diffDays = ((diff % weeks)) / days;
    long diffDays = (diff - (diffYear * year + diffMonth * month + diffWeeks*weeks)) / days;//((diff % weeks)) / days;
    

    警告:这种计算天数或周数的方法将每个月视为30天,这并不总是正确的,因为也可能有28、29、30、31天的月份。这就是为什么你会看到5而不是1

    警告2:不要使用1000*60*60*24*365l,对于较大的数字,它可能会导致整数溢出(使用的第一个数字是整数),而应该使用1000L*60*60*24*365。所以

    • l更改为L,因为l看起来像1,所以可能会让人困惑
    • 开始与long相乘

    为了让事情变得更简单,你甚至可以把它写成

    long seconds = 1000L;
    long minutes = seconds * 60;
    long hours = minutes * 60;
    long days = hours * 24;
    long weeks = days * 7;
    long month = days * 30;
    long year = days * 365;