SORU
12 EKİM 2009, PAZARTESİ


İki Java örnekleri tarih arasındaki farkı hesaplama

Java java kullanıyorum.açıklama.Scala sınıf tarih ve bir tarih karşılaştırmak istediğiniz nesne ve şimdiki zaman. GetTime kullanarak delta hesaplamak biliyorum():

(new java.util.Date()).getTime() - oldDate.getTime()

Ancak, bu sadece bir Uzun milisaniye temsil ile beni bırakır. Daha basit, daha güzel herhangi bir zaman delta almak için var mı?

CEVAP
18 Mayıs 2012, Cuma


Basit diff (lib olmadan)

/**
 * Get a diff between two dates
 * @param date1 the oldest date
 * @param date2 the newest date
 * @param timeUnit the unit in which you want the diff
 * @return the diff value, in the provided unit
 */
public static long getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}

Ve sonra arayabilir misiniz:

getDateDiff(date1,date2,TimeUnit.MINUTES);

dakika biriminde 2 tarih diff almak için.

TimeUnit java.util.concurrent.TimeUnit, standart bir Java numaralama gün için nano gidiyor.


İnsan okunabilir diff (lib olmadan)

public static Map<TimeUnit,Long> computeDiff(Date date1, Date date2) {
    long diffInMillies = date2.getTime() - date1.getTime();
    List<TimeUnit> units = new ArrayList<TimeUnit>(EnumSet.allOf(TimeUnit.class));
    Collections.reverse(units);
    Map<TimeUnit,Long> result = new LinkedHashMap<TimeUnit,Long>();
    long milliesRest = diffInMillies;
    for ( TimeUnit unit : units ) {
        long diff = unit.convert(milliesRest,TimeUnit.MILLISECONDS);
        long diffInMilliesForUnit = unit.toMillis(diff);
        milliesRest = milliesRest - diffInMilliesForUnit;
        result.put(unit,diff);
    }
    return result;
}

http://ideone.com/5dXeu6

Çıkış birimleri ile sipariş Map:{DAYS=1, HOURS=3, MINUTES=46, SECONDS=40, MILLISECONDS=0, MICROSECONDS=0, NANOSECONDS=0} gibi bir şeydir.

Sadece kullanıcı dostu bir dize için o Haritayı değiştirmek zorunda.


Uyarı

Yukarıdaki kod snipets arasında 2 anları arasında basit bir fark hesaplamak. this post açıklandığı gibi ışığından bir geçiş sırasında sorunlara neden olabilir. Bu saat/eksik bir gün olabilir hiçbir zaman tarih arasındaki farkı hesaplamak anlamına gelir.

Bence tarihi fark biraz öznel, özellikle gündür. Olabilir:

  • 24 saat sayısı geçen süre sayısı: 1. gün - gün = 1 gün = 24 saat

  • sayısı süre sayısı, gün ışığından yararlanma bakımı: 1. gün - gün = 1 = 24 saat (ama 0 Gün ve 23 olabilir gece yarısı saat ve Yaz Saati uygulama kullanarak)

  • sayısı sayısı day switches, yani 1 gün 1 gün 11 = 1 gün bile süre sadece 2h (veya 1h olur Ya, bir gün ışığından yararlanma :p)

Cevabımı tarih tanımına günlerde 1 eşleşme durumu fark ise geçerlidir

JodaTime

Eğer JodaTime kullanıyorsanız 2 anları (spittalfields'da millie'nin Readableİnstant destekli) diff ile tarihleri:

Interval interval = new Interval(oldInstant, new Instant());

Ama aynı zamanda Yerel tarihler/saatler için diff alabilirsiniz:

// returns 4 because of the leap year of 366 days
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5), PeriodType.years()).getYears() 

// this time it returns 5
new Period(LocalDate.now(), LocalDate.now().plusDays(365*5 1), PeriodType.years()).getYears() 

// And you can also use these static methods
Years.yearsBetween(LocalDate.now(), LocalDate.now().plusDays(365*5)).getYears()

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • njhaley

    njhaley

    24 NİSAN 2006
  • Skrillex

    Skrillex

    6 NİSAN 2010