Az OTRS saját csomaggal érkezik a dátum és idő kezeléséhez, amely a dátum és idő helyes kiszámítását és tárolását biztosítja.
A dátum és idő egy Kernel::System::DateTime
objektummal
van ábrázolva. Minden DateTime
objektum tartalmazza a
saját dátumát, idejét és időzóna információját. A mostanra elavult
Kernel::System::Time
csomaggal szemben ez azt jelenti,
hogy létrehozhat és létre kell hoznia egy DateTime
objektumot minden egyes dátumhoz vagy időhöz, amelyet használni szeretne.
Az OTRS objektumkezelője kibővítésre került egy Create
metódussal, hogy támogassa azokat a csomagokat, amelyekhez egynél több
példány hozható létre:
my $DateTimeObject = $Kernel::OM->Create( 'Kernel::System::DateTime', ObjectParams => { TimeZone => 'Europe/Budapest' }, );
A fenti példa létrehoz egy DateTime
objektumot a
jelenlegi dátumhoz és időhöz az Európa/Berlin időzónában. További
lehetőségek is vannak egy DateTime
objektum létrehozására
(időösszetevők, szövegek, időbélyegek, klónozás), nézze meg a
Kernel::System::DateTime
POD-ját.
Hibát fog kapni, ha megpróbál egy DateTime
objektumot
lekérni a $Kernel::OM->Get('Kernel::System::DateTime')
használatával.
Az órákban lévő időeltolások (+2, -10, stb.) le lettek cserélve az
időzónákkal (Európa/Berlin, Amerika/New_York, stb.). Az időzónák közti
átalakítások teljes mértékben a DateTime
objektumon belül
vannak megvalósítva. Ha egy másik időzónára szeretne átalakítani, akkor
egyszerűen használja a következő kódot:
$DateTimeObject->ToTimeZone( TimeZone => 'Europe/Budapest' );
Van egy új OTRSTimeZone
rendszerbeállítási lehetőség. Ez
a beállítás határozza meg azt az időzónát, amelyet az OTRS belsőleg használ
a dátum és az idő tárolásához az adatbázison belül.
Biztosítania kell, hogy egy DateTime
objektum át legyen
alakítva az OTRS időzónájára, mielőtt az eltárolásra kerülne az adatbázisba
(van egy kényelmes módszer erre:
ToOTRSTimeZone()
). Kivétel lehet, hogy ha kifejezetten
egy olyan adatbázisoszlopot szeretne, amely egy dátum/idő értéket tárol egy
bizonyos időzónában. Ne feledje azonban, hogy maga az adatbázis önmagában
nem fog időzóna-információkat biztosítani, amikor lekérik azt.
A Kernel::System::DateTime
TimeZoneList()
metódusa biztosítja az elérhető időzónák
listáját.
A Kernel::System::DateTime
csomag biztosítja a következő
metódusokat (ez csak egy kiválasztás, a részletekért nézze meg a
forráskódot).
Egy DateTime
objektum létrehozható az objektumkezelő
Create()
metódusával vagy egy másik
DateTime
objektum leklónozásával a
Clone()
metódusának használatával.
A Get()
metódussal egy DateTime
objektum összes adata vissza lesz adva kivonatként (dátum és idő összetevők,
beleértve a nap nevét, stb., valamint az időzónát).
A Set()
metódussal megváltoztathatja a
DateTime
objektum bizonyos összetevőit (év, hónap, nap,
óra, perc, másodperc) vagy beállíthat egy dátumot és időt egy adott szöveg
alapján ('2016-05-24 23:04:12'). Ne feledje, hogy nem tudja megváltoztatni
az időzónát ezzel a metódussal.
Egy DateTime
objektum időzónájának megváltoztatásához
használja a ToTimeZone()
metódust vagy egyszerűsítésként
a ToOTRSTimeZone()
metódust az OTRS időzóna
átalakításához.
A beállított OTRS időzóna vagy a felhasználó alapértelmezett időzónájának
lekéréséhez mindig az OTRSTimeZoneGet()
vagy a
UserDefaultTimeZoneGet()
metódusokat használja. Sose
kérje le ezeket kézzel a Kernel::Config
használatával.
A Kernel::System::DateTime
operátortúlterhelést használ
az összehasonlításhoz. Így egyszerűen összehasonlíthat két
DateTime
objektumot a <, <=, ==, !=, >= and >
operátorokkal. A Compare()
metódus használható a Perl
rendezési környezetében, mivel -1, 0 vagy 1 a visszatérési értéke.
A mostanra elavult Kernel::System::Time
csomag ki lett
bővítve, hogy teljesen támogassa az időzónákat az időeltolások helyett. Ez
azért történt, hogy biztosítsa a meglévő kód működését (nagyobb) módosítások
nélkül.
Azonban van egy eset, amikor meg kell változtatnia a meglévő kódot. Ha olyan
kódja van, amely a régi időeltolásokat használja egy új dátum és idő
kiszámításához vagy különbségéhez, akkor át kell költöztetnie ezt a kódot,
hogy az új DateTime
objektumot használja.
Példa (régi kód):
# Feltételezzünk egy 0 időeltolást ennél az objektumnál. my $TimeObject = $Kernel::OM->Get('Kernel::System::Time'); my $SystemTime = $TimeObject->TimeStamp2SystemTime( String => '2004-08-14 22:45:00' ); # Általában beállításon vagy paraméteren keresztül van lekérve. my $UserTimeZone = '+2'; my $UserSystemTime = $SystemTime + $UserTimeZone * 3600; my $UserTimeStamp = $TimeObject->SystemTime2TimeStamp( SystemTime => $UserSystemTime );
Példa (új kód):
# Ez hallgatólagosan beállítja a beállított OTRS időzónát. my $DateTimeObject = $Kernel::OM->Create('Kernel::System::DateTime'); # Általában beállításon vagy paraméteren keresztül van lekérve. my $UserTimeZone = 'Europe/Berlin'; $DateTimeObject->ToTimeZone( TimeZone => $UserTimeZone ); # Ne feledje, hogy az epoch független az időzónától, mindig az UTC-hez lesz kiszámítva. my $SystemTime = $DateTimeObject->ToEpoch(); my $UserTimeStamp = $DateTimeObject->ToString();