Zamanla bazı matematik yaparken ben bir garip timewarp çalıştırmak, ve odunum beni terk etti. Ya da, iyi, ben nedenini (veya en azından makul bir) bulduk, ama oldukça bu konuda ne bilmiyorum, ya da yapılabilecek bir şey gerçekten varsa.
Düz bir deyişle konu 1 hafta daha büyük birimlerde zaman (o en çarpanları hariç) eklerken tam olması imkansız gibi görünüyor olmasıdır. Ve tam göre ben ŞİMDİ saniye 1 yıl değerinde eklediğinizde, ŞİMDİ 1 yıl ve birkaç saat sonuna kadar demek.
Ben bir ay boyu değişir olarak 1 (veya daha fazla) ay ekleyerek, bunu anlayabilirim, ama bir yıl bu olmamalı, daha fazla veya daha az aynı olmalıdır?
Şimdi ben bunu bilmek istiyorum biliyorum, bu nedenle burada (pseudoish) kodu aşağıdadır:
class My_DateInterval {
public $length; // Interval length in seconds
public function __construct($interval) {
$this->length = 0;
preg_match(
'/P(((?<years>([0-9]{1,}))Y)|((?<months>([0-9]{1,}))M)|((?<weeks>([0-9]{1,}))W)|((?<days>([0-9]{1,}))D)){0,}(T((?<hours>([0-9]{1,2})){1}H){0,1}((?<minutes>([0-9]{1,2}){1})M){0,1}((?<seconds>([0-9]{1,2}){1})S){0,1}){0,1}/',
$interval, $timeparts
);
if (is_numeric($timeparts['years'])) $this->length += intval($timeparts['years']) * 31556926; // 1 year in seconds
if (is_numeric($timeparts['months'])) $this->length += intval($timeparts['months']) * 2629743.83; // 1 month in seconds
if (is_numeric($timeparts['weeks'])) $this->length += intval($timeparts['weeks']) * 604800; // 1 week in seconds
if (is_numeric($timeparts['days'])) $this->length += intval($timeparts['days']) * 86400; // 1 day in seconds
if (is_numeric($timeparts['hours'])) $this->length += intval($timeparts['hours']) * 3600; // 1 hour in seconds
if (is_numeric($timeparts['minutes'])) $this->length += intval($timeparts['minutes']) * 60; // 1 minute in seconds
if (is_numeric($timeparts['seconds'])) $this->length += intval($timeparts['seconds']);
$this->length = round($this->length);
}
}
class My_DateTime extends DateTime {
public function __construct($time, $tz = null) {
parent::__contruct($time, $tz);
}
public function add(My_DateInterval $i) {
$this->modify($i->length . ' seconds');
}
}
$d = new My_DateTime();
$i = new My_DateInterval('P1Y');
$d->add($i);
Değerler sonra "beklendiği gibi çalıştığını ve tüm kontrolleri dışarı" anlamında, tüm iyi, ancak yukarıda belirtilen sorun hala duruyor göstermek / önce aralık uzunluğu ve bazı hata ayıklama çıktılar yapmak: ve doğruluk bir anomali var ben çok mümkün olmadığını, sağ olsun istiyorum istiyorum hangi hepsi.
Kadar çok kelime: 1 hafta daha fazla zaman birimleri ile tam matematik yapmak için nasıl. (Yani 1 ay / 1 yıl).
PS. Ben My_ * sınıfları kullanıyorum neden merak edenler için PHP 5.3 yeterli yaygın değildir, çünkü, ama ben yerleşik yardımcı sınıflar için göç mümkün olduğunca düzgün olacak bir şekilde bir şeyler tutmaya çalışıyorum.