Joda-Time: Dönem, Aralık ve Süre arasındaki fark nedir?


192

In Joda-Time 2, zaman süreçleri üç çeşit arasındaki fark nedir:

  • dönem
  • Aralık
  • süre

    1. Neden üç sınıfa ihtiyacımız var?

    2. Hangisi daha iyi performans gösteriyor?

    3. Bir Periyot veya Süre veya Aralık örneğinin bölünmesi neden uygulanmıyor? Örneğinp = p.divideBy(2);


3
Bu tarih-saat terminolojisinin standartlaştırılmadığını (henüz) unutmayın. ISO-8601 a Standardın fikri süresi Joda-Time olarak kabul ettiği şeydir Period. Bu terminolojiyi standartlaştırma önerisi gündeme getirildi ancak henüz tamamlanmadı.
Basil Bourque

Yanıtlar:


246

Farklı sınıfları temsil ettikleri için 3 sınıfa ihtiyaç vardır, bu yüzden göreceli performanstan ziyade işe uygun olanı seçmek meselesidir. Gönderen belgelerinde bana tarafından eklenen yorumlarla italik :


Bir aralık Joda-Time bir anlık bir milisaniye andan itibaren zaman aralığını temsil etmektedir. Her iki örnek de, saat dilimi ile birlikte, datetime sürekliliğinde tam olarak belirtilen örneklerdir. Belirli zamanlar tanımlanır, örneğin bu dün 20: 00: 00GMT ile bu sabah 09: 00: 00GMT arasındaki aralık olabilir.

Bir süre Joda-Time milisaniye cinsinden ölçülen bir zaman süresi temsil eder. Süre genellikle bir aralıktan elde edilir. yani bir süre türetmek için bir aralığın sonundan başlangıcı çıkarabiliriz

Bir dönem Joda-Time örneğin alanları bakımından tanımlanmış bir süre, 3 yıl 5 ay 2 gün ve 7 saat temsil eder. Bu, milisaniye cinsinden kesin olmadığı için bir süreden farklıdır. Bir süre, ilgili olduğu anı (kronoloji ve saat dilimi dahil) belirterek tam milisaniyeye kadar çözülebilir. Örneğin, 1 yıllık dönemi düşünün, bunu 1 Ocak'a eklersek, her zaman 1 Ocak'a ulaşacağız, ancak süre, geçen yılın artık yıl olup olmadığına bağlı olacaktır. Benzer şekilde bir ayın 1'ine 1 ay eklersek, bir sonraki ayın 1'ine ulaşırız ancak süre (milisaniye cinsinden) söz konusu aya göre değişir


Soru 3 için Süreyi bölmek için belirli bir yönteme gerçekten gerek yoktur, çünkü süreden milisaniye sayısını her zaman long(kullanarak getMillis()) alabilir, bölebilir ve yeni bir süre (kullanarak new Duration(long duration)) oluşturabiliriz.

Bir dönemin bölünmesi, yukarıdaki dönemin tanımına dayalı olarak gerçek bir anlama sahip değildir. örneğin yarım ay nedir? (uzunluğu hangi aya bağlı olacaktır).


1
Bir dönemin bölünmesinin bir anlamı olduğunu düşünüyorum - yarım ay hala geçerli bir zaman birimidir, ancak tam olarak ne kadar süreceğini bilmek için bir başlangıç ​​tarihi gerektirir (bir ayın tam olarak aynı şekilde geçerli bir dönemdir).
hadley

11
Jodatime, bir periyodu INTEGER değerli alanlardan oluşan bir demet olarak kabul eder, kesirli değerlere izin vermez. Bu yaygın (sivil) kullanımla tutarlıdır. Pratik olarak, ortak yaşamdaki hiç kimse '1 ay ve 10 gün' ikiye bölünür 'yarım ay ve 5 gün' olduğunu düşünmüyor. Bu bölümü yapmanız gerekiyorsa, muhtemelen bir süreye (fiziksel zaman) gitmek istersiniz.
leonbloy

90

Mikej'ın cevabına eklemek için :

Bir Joda-Time süresi "fiziksel" zaman aralığıdır; Örneğin:

12000 milliseconds <- bu bir süredir

Bir Joda-Time aralığı aslında bir çift örnektir (başlangıç ​​anında - bitiş anında). Bir an , yine, "fiziksel" bir kavram, zaman çizelgesindeki bir noktadır. Örneğin (sadece olası bir gösterim):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- bu bir aralıktır

Bir aralık , daha sonra bir süreye dönüştürülebilir , ancak tersine çevrilemez .

Şu iki aralığı düşünün:

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

Aralıklar olarak I1ve I2farklıdır, çünkü uç noktalar farklıdır; Ben sürelere çevirebiliriz ama eğer ben de aynı şeyi olsun: 3600000 milliseconds.

(Matematik benzetmesi: aralıklar [10,12]ve [95,97]farklı aralıklardır , ancak aynı uzunluktadırlar : "aralık uzunluğu" süreye eşler ).

Son olarak, bir dönem , birkaç ay, gün, saat vb. Olarak ifade edilen bir "sivil zaman" süresidir. -Kendi başına- bir "fiziksel" aralığı temsil etmez, dolayısıyla doğrudan bir süresi (ayların değişken uzunlukları vardır ...).

Bu 3. soruya cevap verir: Fiziksel bir zaman (süre) yalnızca ikiye bölebilirsiniz.


Dört ayın ikiye bölünmesi iki ay olacaktır. Bu neden geçerli değil?
hadley

1
'2 Ay nasıl hesaplanırsınız; 18 güne 3? Bu tür bir operasyon için tutarlı bir tanım elde edemezsiniz.
leonbloy

3
Bence tutarlı bir tanım elde edebilirsiniz, ancak bunu "2 ay 18 gün" süresinin 1 / 3'ü olarak düşünmeniz gerekir. Bir aralığa dönüştürene kadar tam olarak ne olduğunu hesaplayamazsınız. JODA'nın desteklememesi, geçersiz olduğu anlamına gelmez.
hadley

@hadley "Günün üçte biri" için sivil bir tanım yoktur. Örneğin, hiçbir sözleşme günün üçte biri için geçerli değildir.
ipavlic

4
@Richard Watson Günleri DST nedeniyle 23, 24 veya 25 saat uzunluğunda olabilir. Bu nedenle "günde başlayan üçte biri ..." geçerlidir, ancak yalnızca "üçte biri" geçerli değildir.
ipavlic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.