mboost-dp1

"Kalender"tabel


Gå til bund
Gravatar #51 - arne_v
12. aug. 2009 14:09
#41

Mit forslag:


<?php
// old PHP
function findweekdate($y, $w, $d) {
$target = $y . ' ' . $w . ' ' . $d;
$t = mktime(0, 0, 0, 1, 29, $y-1);
while(date('o W N', $t) != $target) {
$t += (24*60*60);
}
return $t;
}
$res = findweekdate(2009, 33, 1);
echo date('d/m/Y', $res) . "\r\n";
// PHP 5.2+
$dt = new DateTime();
$dt->setISODate(2009, 33, 1);
echo $dt->format('d/m/Y') . "\r\n";
?>
Gravatar #52 - Windcape
12. aug. 2009 14:11
Ooh, så PHP *har* fået et DateTime API. Så må jeg undskylde for de tidligere udsagn :)

http://dk2.php.net/manual/en/datetime.construct.ph...

Og den ser sørme ud til at benytte en DATETIME string som construct, ikke unixtime :D
Gravatar #53 - XorpiZ
12. aug. 2009 14:20
#41

Hmm, jeg kan ikke få det nederste eksempel til at virke. Jeg kører PHP 5.3.0 ifølge phpinfo();, men hvis jeg tester de sidste tre linjer, så får jeg bare en blank side frem. Det plejer at være et tegn på, at der er noget galt :)
Gravatar #54 - arne_v
12. aug. 2009 14:22
#53

Jeg har testet på 5.2.5.

Prøv og slå fejlmeddelelser til og se om du ikke kan finde problemet.
Gravatar #55 - XorpiZ
12. aug. 2009 14:27
Den giver en "parse error" i denne linje:

$dt = new DateTime();
Gravatar #57 - XorpiZ
12. aug. 2009 14:32
Nvm, den virker nu. Havde lavet en ¨ et sted i filen ved et uheld, så den meldte fejl :(
Gravatar #58 - arne_v
12. aug. 2009 14:50
#57

:-)
Gravatar #59 - Acro
12. aug. 2009 18:37
fidomuh (46) skrev:

Det giver bare ikke nogen mening for mig at bruge noget andet end unixtime til timestamps, da det ( imo ) er vaesentligt nemmere at arbejde med.


Du bliver altså nødsaget til at forklare mig, hvad du mener, at fordelen ved Unix time - for dig - er.
Jeg er helt med på, at der kan være en fordel for databasen i at bruge det som bagvedliggende format, men det er noget helt andet. Det er ikke noget, du skal tage dig af.

Du nævner også selv, at du skal konvertere til en rigtig dato, hvis den skal præsenteres, så hvorfor giver det nogensinde mening for dig at have datoen i et andet format, som du ikke kan læse direkte?
Jeg vil også meget gerne vide, hvordan det er meget lettere for dig med Unix time at finde et ugenummer, end det er med en mere OO-baseret repræsentation af en dato.
Gravatar #60 - fidomuh
13. aug. 2009 08:50
#59

Du bliver altså nødsaget til at forklare mig, hvad du mener, at fordelen ved Unix time - for dig - er.


Kort sagt, at det er ufatteligt meget nemmere at traekke tid fra og til.

Jeg er helt med på, at der kan være en fordel for databasen i at bruge det som bagvedliggende format, men det er noget helt andet. Det er ikke noget, du skal tage dig af.


Jeg laver ellers det hele her, og hvis Unixtime er hvad der ligger i databasen, hvorfor saa ikke bare arbejde med det?

Du nævner også selv, at du skal konvertere til en rigtig dato, hvis den skal præsenteres


Ja, selvfoelgelig.
090101014055 <-- er ogsaa rimeligt fucking ubrugeligt for klienterne.

så hvorfor giver det nogensinde mening for dig at have datoen i et andet format, som du ikke kan læse direkte?


Hvornaar har jeg brug for at laese det direkte?

Jeg vil også meget gerne vide, hvordan det er meget lettere for dig med Unix time at finde et ugenummer, end det er med en mere OO-baseret repræsentation af en dato.


Hvordan faar jeg, i PHP, ugenummeret ud af DATETIME eller TIMESTAMP?
Med unixtime skriver jeg date("w",[time]).

Og i unix/shell goer jeg, sjovt nok, det samme.

Jeg ser ikke nogen grund til IKKE at bruge Unixtime naar det alligevel er hvad jeg gemmer i databasen.
Saa man kan sige at det er nemmere, fordi det er nemmere at laegge tid fra og til - og det er typisk det jeg bruger mest.
Gravatar #61 - Windcape
13. aug. 2009 11:05
fidomuh (60) skrev:
Kort sagt, at det er ufatteligt meget nemmere at traekke tid fra og til.
Hvor tit er det lige man gør det?

Jeg synes stadig du skal prøve at genskrive koden fra #3 , tilpasset whatever SQL din favoridt DB kører, med UNIXTIME istedet for DATE eller DATETIME.

At generere et timestamp der ikke refferere til et tidspunkt der slutter med hh:mm:ss er en halv umulighed.

Og indtil videre har du nægtet at tage stilling til andet end præsentation, noget der altid er nemt.

I C# skriver jeg .ToString("w"); og så er den klat ude af verden. (Eller string.Format("{0:w}", myDate); ). Præsentation er ligegyldigt, vi snakker altså om data!

Og vi har jo bevist flere gange at dine muligheder direkte på databasen er meget begrænsende med unixtime. Du kan ikke validere om en dato er invalid med det blotte øje, og du skal skrive unødvendig meget kode for at foretage dig det samme som med DATETIME.

Shell kommandoer er nok så irrelevant i forhold til programmering som det kan blive. De er et nærmest modsat paradigm.
Gravatar #62 - fidomuh
13. aug. 2009 11:16
#61

Hvor tit er det lige man gør det?


*kigger i samtlige shell scripts og php dokumenter*
... Altid?

Shell kommandoer er nok så irrelevant i forhold til programmering som det kan blive. De er et nærmest modsat paradigm.


Jojo, det synes jeg ogsaa .NET og ASP er, men derfor svarer jeg stadig paa hvad JEG bruger det til og hvorfor JEG foretraekker det.
Gravatar #63 - Windcape
13. aug. 2009 11:47
fidomuh (62) skrev:
*kigger i samtlige shell scripts og php dokumenter*
Det er ikke så tit jeg skal "bare" lave simple matematik, og udover det har vi jo vist at et full OO representation er simplere.

Derudover sammenlign:

time = 1249249912 + 86400;

time = DateTime.Now.AddDays(1);

Det er rimelig åbenlyst hvilket kode er nemmest at læse, nemmest at huske, og nemmest at maintaine.
Gravatar #64 - fidomuh
13. aug. 2009 13:10
#63

Sigh, du tvinger mig jo til at grave kode frem :)

Men eh:
time = time(++1d);
[add]
SKal lige siges at dette er en funktion i date, egentligt, som behandler unixtime.
Ellers vil det jo blot vaere time+86400, som ganske vist ikke er saa nemt at arbejde med ud fra det blotte oeje, men jeg har nu altid brugt samme funktionsframework ( min egen samling ) som godtager fx myTime(+1d).
[/add]

vs
time = DateTime.Now.AddDays(1);

Jeg er helt med paa hvad der er nemmest, er forskellen ikke blot hvordan API'et haandterer det?
Altsaa, helt basalt saa skal man jo i 99.9999% af tilfaeldene have dataene koert igennem en process, saa om man bruger unixtime eller OO er dybest set ligegyldigt.

Jeg foretraekker unixtime, fordi jeg saa kan behandle det som normale integers :)

Saa kan jeg fx tjekke om A er tidligere end B:
If($A<$B){
echo "Yespls.";
};

Jeg synes personligt bare at det er nemmere at arbejde med i nogle tilfaelde, og de tilfaelde hvor det ikke er nemmere, foeler jeg at det er det samme :)
Gravatar #65 - Windcape
13. aug. 2009 13:15
fidomuh (64) skrev:

Saa kan jeg fx tjekke om A er tidligere end B:
If($A<$B){
echo "Yespls.";
};
< > = operators er også defineret for DateTime i C# ;-)

Men det handler mere om abstraktionsniveau, og data-integritet, ting som ikke rigtig virker relevant på det niveau du programmere på.

Men hvis jeg skulle designe et kæmpe system, vil jeg nok ikke benytte unixtime. Jo flere operationer der kan klares i ren SQL, destro mere kan du flytte workload som det passer dig.
Gravatar #66 - myplacedk
13. aug. 2009 13:18
windcape (65) skrev:
Jo flere operationer der kan klares i ren SQL

De jeg rodede med SQL fungerede unixtimestamps nu fint nok.

Men det kommer jo nok an på hvad du mener med "ren SQL".
Gravatar #67 - Windcape
13. aug. 2009 13:21
myplacedk (66) skrev:
Men det kommer jo nok an på hvad du mener med "ren SQL".
Funktioner som:

DAY, MONTH, WEEK, YEAR, DATEADD, DATE_FORMAT, DATEDIFF osv. er bygget på DATE og DATETIME, ikke integer værdier.

Samt det at bygge CONSTRAINTS (validering).

Og tidligere emner som vi har nævnt er tidszoner, skudår, milisekunder. Listen fortsætter derudaf.
Gravatar #68 - fidomuh
13. aug. 2009 13:27
#65

Det er sandt.
Hvis jeg skulle strikke et kaempe system sammen ville jeg klart revurdere min egen praeference, men jeg ville goere det for hvert system.

Hvis man vender den om, saa er det jo rent faktisk blot et spoergsmaal om hvor man oensker at lave omregningen:
I dit "klient-til-sql" system, eller i SQL systemet.

Husk at du med DATEADD ( fx ) stadig omregner paa en eller anden maade.
Og i dette tilfaelde ville jeg vaelge udfra performance :)

Data "integritet" har, imo, ikke noget at goere med at vaelge DATETIME fremfor UNIXTIME.
Gravatar #69 - Windcape
13. aug. 2009 13:33
fidomuh (68) skrev:
Husk at du med DATEADD ( fx ) stadig omregner paa en eller anden maade. Og i dette tilfaelde ville jeg vaelge udfra performance :)
Umidbart er mit gæt at der reelt ikke er et performance tab. Og jeg tror at DATEADD er mere optimiseret end "+ 86400".

fidomuh (68) skrev:
Data "integritet" har, imo, ikke noget at goere med at vaelge DATETIME fremfor UNIXTIME.
Hvis du skal expose til en webservice, eller flytte dataen mellem forskellige systemer, så er der!
Gravatar #70 - myplacedk
13. aug. 2009 17:26
windcape (67) skrev:
DAY, MONTH, WEEK, YEAR, DATEADD, DATE_FORMAT, DATEDIFF osv. er bygget på DATE og DATETIME, ikke integer værdier.
[osv]

Jaja, men i hvert fald nogle DBMS'er kan konvertere. Spørgmålet er om det er "rent" nok til dig.
Gravatar #71 - Windcape
13. aug. 2009 17:39
myplacedk (70) skrev:
Jaja, men i hvert fald nogle DBMS'er kan konvertere. Spørgmålet er om det er "rent" nok til dig.
Umidbart arbejder jeg kun med MS SQL og MySQL, og begge's API er bygget på DATETIME.

Self. kan de konvertere, men hvorfor konvertere i SQL, OG business logic?
Gravatar #72 - myplacedk
13. aug. 2009 18:05
#71
Fordi udvikleren tilsyneladende ser nogle fordele der er større end ulemperne.
Gravatar #73 - fidomuh
14. aug. 2009 06:34
#71

Self. kan de konvertere, men hvorfor konvertere i SQL, OG business logic?


Du konverterer jo kun i business logic i begge tilfaelde?
SQL serveren kan jo, som du siger, ikke arbejde med UnixTime, saa uanset hvad, saa skal din "klient" konvertere/udpege, etc.
Gravatar #74 - arne_v
15. aug. 2009 18:33
#51

Og så anden forbedrede udgave:


<?php
// traditional (any PHP)
putenv('TZ=Europe/Copenhagen');
function findweekdate1($y, $w, $d) {
$target = "$y $w $d";
$t = mktime(12, 0, 0, 12, 29, $y-1);
$t += (($w - 1)*7*24*60*60);
for($i = 0; $i < 14; $i++) {
if(date('o W N', $t) == $target) {
return $t;
}
$t += (24*60*60);
}
return 0;
}

$res = findweekdate1(2009, 33, 1);
echo date('d/m/Y', $res) . "\r\n";
$res = findweekdate1(2009, 63, 1);
echo date('d/m/Y', $res) . "\r\n";

// OOP (PHP 5.2+)
date_default_timezone_set('Europe/Copenhagen');

$dt = new DateTime();
$dt->setISODate(2009, 33, 1);
echo $dt->format('d/m/Y') . "\r\n";
$dt->setISODate(2009, 63, 1);
echo $dt->format('d/m/Y') . "\r\n";

// alternative (newer PHP, possible 5.1+)
date_default_timezone_set('Europe/Copenhagen');

function findweekdate2($y, $w, $d) {
return strtotime("$y-W$w-$d");
}

$res = findweekdate2(2009, 33, 1);
echo date('d/m/Y', $res) . "\r\n";
$res = findweekdate2(2009, 63, 1);
echo date('d/m/Y', $res) . "\r\n";
?>
Gravatar #75 - arne_v
15. aug. 2009 18:38
arne_v (17) skrev:

MySQL har f.eks. både en DATETIME type som gemmes som yyyymmdd og hhmmss og en TIMESTAMP type som gemmes som Unix tid.

I de fleste tilfælde er det ligegyldigt om man vælger den ene eller den anden.

Den største forskel er at Unix tid er UTC tid ikke lokal tid.


Den største forskel i værdien isoleret.

Den største forskel generelt er, at TIMESTAMP felter (medmindre man disabler det) automatisk opdaterer til NOW() hver gang rækken opdateres.

Det har en stor praktisk betydning.
Gravatar #76 - arne_v
15. aug. 2009 22:23
windcape (16) skrev:
Med typisk ORM kan du jo netop mappe et DATE eller DATETIME field til en specifik type direkte, hvor unixtime er et Integer felt, og derfor kræver ekstra mapping, hvis det givne ORM framework overhovedet tillader det.


UNIXTIME behøver ikke være et INTEGER felt. Det er det f.eks. ikke i MySQL.

Et TIMESTAMP felt i MySQL kræver ikke noget specielt (i NHibernate).

windcape (18) skrev:
Jeg vil stadig fraråde det i .NET, da ORM frameworks som Linq2Entities er svære at skrive manuelle mappings til.


Hvis vi nu snakker om INTEGER felt.

LINQ2EF's problem.

I NHibernate laver man bare en ekstra property som konverterer.

windcape (18) skrev:
Det er vel også ret meningsløst at gemme som UNIXTIME, når både SQL og alle ORM produkter, baserere sine APIs på at det er DATE/DATETIME.


Det er ret meningsløst at gemme i et INTEGER felt.
TIMESTAMP kan udmærket give mening.

Gravatar #77 - arne_v
15. aug. 2009 22:25
windcape (18) skrev:
Jeg ser sjældent andre end PHP udviklere gøre det, fordi de ikke har et særlig godt date/time API til rådighed.


Der er nu også mange C programmører som bruger time_t, som er Unix tid.
Gravatar #78 - Windcape
15. aug. 2009 22:30
arne_v (76) skrev:
Det er ret meningsløst at gemme i et INTEGER felt.
Folk gør ellers stort set aldrig andet.

Blev helt overrasket da du nævnte TIMESTAMP som field-type. Havde jeg aldrig hørt om før, og har ikke set et eneste open-source project som benytter MySQL, bruge TIMESTAMP some field-type, de sidste tjah.. 6 år?

arne_v (76) skrev:
I NHibernate laver man bare en ekstra property som konverterer.
Det gør man også i Linq2ef, men hele essensen er jo at du slipper for at arbejde meget med mappings, og ikke skal skrive mange store tunge XML filer, som (n)Hibernate kræver.

Desuden var fidomuh's argument jo også at unixtime var nemmere at arbejde med fra kode, typisk fordi han ikke gider lære et Date/Time API, som DateTime klassen in PHP5.
Gravatar #79 - arne_v
15. aug. 2009 23:15
windcape (37) skrev:
At alle funktionerne der bearbejder datoer der, benytter DATETIME som argument (faktisk en string, for at være præcis), ikke TIMESTAMP.


Nej. De virker både med DATETIME og TIMESTAMP felter.

De virker også med strenge som kan konverteres til DATETIME/TIMESTAMP. Og det bruger de i eksemplerne da det er mest praktisk.
Gravatar #80 - arne_v
15. aug. 2009 23:51
#datetime vs. unixtime

Jeg synes at diskussionen kørte lidt af sporet.

Der er 3 muligheder for data type:

A) En tid type som gemmer de enkelte komponter af tiden. Det bruger MySQL for DATETIME, DATE og TIME. C bruger det for struct tm.

B) En tid type som gemmer antal enheder siden et absolut tidspunkt, Det bruger MySQL for TIMESTAMP. C bruger det for time_t.. NET bruger det for DateTime. Java bruger det for Date.

C) En tal type som gemmer i samme format som B. Det svarer til at gemme Unix tid i et integer felt.

#C er ikke god fordi man ikke kan bruge al den indbyggede support for dato og tidsoperationer.

#A og #B kan begge fint bruges.

#A er nemmest til at pille ymdhms dele ud og til skæve operationer såsom at ligge en måned eller et år til (fordi disse ikke er lige lange).

#B er nemmest til at simple operationer såsom at ligge dage eller timer til (fordi disse er lige lige lange) og til at håndtere tidszoner.

Det er naturligvis muligt at konvertere mellem en tid i form af tidskomponenter og en tid i form af enheder siden et absolut tidspunkt. Men bemærk at en sådan konvertering er kalender specifik.

Ugenumre er et helvede uanset hvad. Og det gør det ikke bedre at MS aldrig har kunnet udregne korrekte ISO 8601 uge numre.

Men fakta er at et MySQL TIMESTAMP og en .NET DateTime gemmer tid i samme form. Der er bare forskelligt basis tidspunkt (1970 og 1) og forskellig enhed (sekunder og 100 nano sekunder).

Der er så to muligheder for at tilgå data.

X) Procedurelt. SQL, C, PHP.

Y) Objekt orienteret. .NET, Java, PHP.

#Y er måske nok en lille smule pænere end #X. Men #X har fungeret fint i 50 år.

Man kan se forskellen i PHP 5.2+:


<?php
date_default_timezone_set('Europe/Copenhagen');

// PP style
$dt = date_create();
date_isodate_set($dt, 2009, 33, 1);
echo date_format($dt, 'd/m/Y') . "\r\n";

// OOP style
$dt = new DateTime();
$dt->setISODate(2009, 33, 1);
echo $dt->format('d/m/Y') . "\r\n";
?>


De fleste vil nok foretrække den sidste variant. Men forskellen er såmænd ikke så stor.

Men bemærk at #X vs #Y er uafhængigt af #A vs #B vs #C.
Gravatar #81 - arne_v
15. aug. 2009 23:56
windcape (78) skrev:
Det gør man også i Linq2ef, men hele essensen er jo at du slipper for at arbejde meget med mappings, og ikke skal skrive mange store tunge XML filer, som (n)Hibernate kræver.


Mappings bliver ikke større fordi man bruger en ekstra property i sin klasse.

LINQ2EF har vist iøvrigt betydeligt større XML filer end NHibernate.

Forskellen er bare t MS leverer tools til at generere de XML filer med. Det gør NHibernate ikke. Men der findes 3. parts produkter som kan generere mappings for NHibernate.
Gravatar #82 - arne_v
16. aug. 2009 00:35
Og så lige en stribe korrektioner.

fidomuh (30) skrev:
Som en ret daarlig loesning kunne du jo finde foerste dag i foerste uge, regne +33 uger og saa tjekke om date("w",[timestamp]) giver dig 33 :)


fidomuh (60) skrev:
Med unixtime skriver jeg date("w",[time]).


date("w",ts) giver day in week - det er date("W",ts) som giver week in year.

fidomuh (49) skrev:
Det er PHP, saa jeg kan ikke fortaelle dig om det er en INT eller en Float


Det kan du nu sagtens is_int, is_double etc. afslører det.

I mangel af en egnet decimal type i PHP, så bør penge opbevares som heltals ører.

fidomuh (49) skrev:
( Et stykke papir er ikke ensbetydende med at man ved hvad man snakker om )


DBA er en job titel ikke en uddannelse.

fidomuh (64) skrev:
Men eh:
time = time(++1d);


Der er så mange fejl i den linie, at det er svært at gætte på hvad det skulle være.

Måske:

$ts = strtotime('+1 day', $ts);

fidomuh (64) skrev:
men jeg har nu altid brugt samme funktionsframework ( min egen samling ) som godtager fx myTime(+1d).


Og den er også invalid PHP syntax.
Gravatar #83 - fidomuh
16. aug. 2009 07:57
#82

Om det er validt eller ej, er imo irrelevant for mit eksempel.

Pointen var bare at det snildt kan lade sig goere, som du jo fint understreger. :)
( Og jeg kunne ikke huske om det var W eller w, gik ud fra det var ligegyldigt ;) )
Gravatar #84 - arne_v
16. aug. 2009 15:39
fidomuh (83) skrev:
Om det er validt eller ej, er imo irrelevant for mit eksempel.


I en diskussion om hvorvidt noget er nemt ved at bruge en given teknik er det ret relevant at koden er valid.

Det er ikke noget problem at lave nem kode, hvis det ikke er et krav at den skal virke.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login