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

时间:2014-02-23 11:47:17

标签: java date timestamp

这是我的代码,

e.g。 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天

我不想使用joda时间。它应该在 java.util。*;

请提前回复,谢谢。

1 个答案:

答案 0 :(得分:3)

您可以尝试使用Period

中的Joda-time
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 

更新

回答您的原始问题:就像您从year减去已经属于diff的天数来计算月数一样,您需要减去

  • 用于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个月。这就是为什么而不是1天,您会看到5

警告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;