Avatar billede thomase Nybegynder
04. januar 2003 - 01:47 Der er 41 kommentarer og
1 løsning

formatering af unix_timestamp(now())

Hej
Jeg har en base med news hvor der er et felt af typen datetime der hedder dato.
i det har jeg lagt value  unix_timestamp(now())

Når jeg trækker det ud igen ønsker jeg at have det stående på følgende måde:

13. Januar

hvis nyheden er ældre end 2 dage

Idag 14.45

hvis nyheden er fra idag

Igår 14.45

hvis nyheden er fra igår

og

13. januar 2002

hvis nyheden er fra sidste år

Jeg har rodet en del med date() osv men kan ikke få det til at makke ret. Hvis jeg med fordel bør gemme på en anden måden i basen, vil jeg også gerne høre om det.
Mvh
Thomas
Avatar billede turengaartil Nybegynder
04. januar 2003 - 01:50 #1
hvor meget af det kan du få den til ???
Avatar billede jakoba Nybegynder
04. januar 2003 - 01:58 #2
unix_timestamp skal bruges når du henter data ud af tabellen, ikke når du lægger den ind i den.

UPDATE tabelnavn SET tiden = now() WHERE id = 45

SELECT unix_timestamp( tiden ) as tid45 FROM tabelnavn WHERE id = 45
Avatar billede tipsen Nybegynder
04. januar 2003 - 01:59 #3
unix_timestamp(now()) er dobbeltkonfekt - hvis du alligevel kun skal bruge unix_timestamp for dags dato, skriver du bare unix_timestamp() !
Avatar billede jakoba Nybegynder
04. januar 2003 - 02:00 #4
ikke for det du kan også gøre det på den anden måde, men så husk det er et tal du får, og ikke en datostreng.
Avatar billede tipsen Nybegynder
04. januar 2003 - 02:01 #5
Enig - brug datetime-typen: http://www.mysql.com/doc/en/DATETIME.html og gem NOW() som værdi!

Når du så hiver tiden målt i "unix-timestamp"-enheder ud, burde du nemt kunne bruge php's funktioner til at arbejde med dine tider...
Avatar billede tipsen Nybegynder
04. januar 2003 - 02:03 #6
BTW: Ved ikke om der kan være nogle issues omkring at et unix-timestamp ikke måles på samme måde i MySQL vs. PHP - mener jeg tidligere har hørt om nogle problemer, men kan ikke huske hvilken platform det var på.
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:05 #7
Hvis du gemmer tiden i Unix Epoch kan du styre hvad der skal stå ved dato med denne her:
-------------
$monname = array('januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december');
$tidnu = time();
$databasetid = // Husk at sætte datoen fra databasen ind her i unix epoch format
if (date("Y",$databasetid) != date("Y",$tidnu)) {
    // sidste år
    echo "".date("j",$databasetid).". ".$monname[date("n",$databasetid)-1] ." ". date("Y",$databasetid);
}
elseif (($databasetid > $tidnu - 24*60*60) && (date("w",$databasetid) == date("w",$tidnu))) {
    //Idag
    echo "Idag " . date("G:i",$databasetid);
}
elseif ($databasetid > $tidnu - 24*60*60 || (($databasetid > $tidnu - 48*60*60) && ((date("w",$databasetid) == date("w",$tidnu) -1) || ((date("w",$databasetid) == 6 && date("w",$tidnu) == 0))))) {
    //Igår
    echo "Igår " . date("G:i",$databasetid);
}
else {
    //I år men før i går
    echo "".date("j",$databasetid).". ".$monname[date("n",$databasetid)-1];
}
-------------
Avatar billede thomase Nybegynder
04. januar 2003 - 03:07 #8
ok så langt så godt. men hvordan laver jeg en variabel med dagen idag, som jeg kan sammenligne med den her, for at se om det er idag:
$checkidag = date('d/m/Y',$row_tekst1['tid']);
og hvordan laver jeg $checkigaar = date('d/m/Y',$row_tekst1['tid']); om til igaar?
skal jeg så trække 1 dag i sekunder fra $row_tekst1['tid'] først??
Avatar billede thomase Nybegynder
04. januar 2003 - 03:10 #9
ups glemte lige at refreshe.. jeg roder lige lidt med dit svar broegaard
Avatar billede Slettet bruger
04. januar 2003 - 03:13 #10
Indsæt i din tabel et unix_timestamp, og lad PHP regne dit datoformat
ud eg. vha. nedenstående funktion:

<?
function format_date($timestamp) {
    $now = time();   
    setlocale (LC_ALL, 'da_DK.ISO-8859-1');
   
    # ikke samme aar
    # bemærk! dette check _skal_ vaere foerst da vi ellers laver fejl i de andre funktioner
    if (date('y', $timestamp) != date('y', $now))
        return strftime("%d. %B %Y", $timestamp);
   
    $days_between = date('z', $now) - date('z', $timestamp);
   
    # ældre end igaar
    if ($days_between > 1)
        return strftime("%d. %B", $timestamp);   
       
    # igaar
    if ($days_between == 1)
        return strftime("Igår %H.%M", $timestamp); 
   
    # idag
    if($days_between == 0)
        return strftime("Idag %H.%M", $timestamp);   

    # en dato i fremtiden
    return strftime("Fremtiden %d. %B", $timestamp);   
}
echo ($date = format_date(time() - 60000)) ? $date : "Fejl i timestamp";
?>
Avatar billede tipsen Nybegynder
04. januar 2003 - 03:15 #11
broegaard: Rigtig pæn løsning - jeg kan godt lide den måde du har opbygget din if-else struktur - det er smart!

Kan den sidste elseif ikke være:

elseif (($databasetid > $tidnu - 48*60*60) && ((date("w",$databasetid) == date("w",$tidnu) -1) || ((date("w",$databasetid) == 6 && date("w",$tidnu) == 0))))
Avatar billede thomase Nybegynder
04. januar 2003 - 03:31 #12
broegaard det ser jo ud til at det præcist det jeg mangler, men den laver parse error i denne linie:
echo "".date("j",$databasetid).". ".$monname[date("n",$databasetid)-1] ." ". date("Y",$databasetid);

jeg må indrømme at jeg ikke ved om jeg har Unix Epoch format (!!) men det er en linux server og tiden er gemt i basen med now() og taget ud med "SELECT unix_timestamp(dato) as tid"

$databasetid = $row_tekst1['tid'];

hvad gør jeg galt?
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:33 #13
tak for de pæne ord.
Jo, det er rigtigt der er lige smuttet en lille betingelse for meget ind. Men det havde ikkke revet nogen forskel på upputtet. Men det var en smutter. Min fejl.
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:40 #14
jeg er rimlig ny inden for php så jeg kender ikke now() og den står ikke på php.net
hvis det er unix epoch er det bare et tal lige nu er: 1041647891
så den skulle gerne komme med et 10 eller 9 cifret tal når du skriver
echo $row_tekst1['tid'];
hvad skriver den når du skriver echo $row_tekst1['tid'];
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:45 #15
Jeg har lige opdaget en smutter mere. Ved års skifte ville den bare vise dato for  f.eks d. 31 december når vi havde d. 1 januar. Så her er den en gang til:
$monname = array('januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december');
$tidnu = time();
$databasetid = // Husk at sætte datoen fra databasen ind her i unix epoch format

if (($databasetid > $tidnu - 24*60*60) && (date("w",$databasetid) == date("w",$tidnu))) {
    //Idag
    echo "Idag " . date("G:i",$databasetid);
}
elseif ((($databasetid > $tidnu - 48*60*60) && ((date("w",$databasetid) == date("w",$tidnu) -1) || ((date("w",$databasetid) == 6 && date("w",$tidnu) == 0)))) {
    //Igår
    echo "Igår " . date("G:i",$databasetid);
}
elseif (date("Y",$databasetid) == date("Y",$tidnu)) {
    //I år men før i går
    echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1];
}
else {
    // sidste år
    echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1] ." ". date("Y",$databasetid);
}
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:46 #16
Og en gang til. Der var kommet en parantes for meget med denne gang:
-------------
$monname = array('januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december');
$tidnu = time();
$databasetid = // Husk at sætte datoen fra databasen ind her i unix epoch format

if (($databasetid > $tidnu - 24*60*60) && (date("w",$databasetid) == date("w",$tidnu))) {
    //Idag
    echo "Idag " . date("G:i",$databasetid);
}
elseif (($databasetid > $tidnu - 48*60*60) && ((date("w",$databasetid) == date("w",$tidnu) -1) || ((date("w",$databasetid) == 6 && date("w",$tidnu) == 0)))) {
    //Igår
    echo "Igår " . date("G:i",$databasetid);
}
elseif (date("Y",$databasetid) == date("Y",$tidnu)) {
    //I år men før i går
    echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1];
}
else {
    // sidste år
    echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1] ." ". date("Y",$databasetid);
}
Avatar billede thomase Nybegynder
04. januar 2003 - 03:46 #17
ja den skriver ganske rigtigt 1041644236
... det er bare den parse error
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:52 #18
prøv med den nederste
Avatar billede thomase Nybegynder
04. januar 2003 - 03:54 #19
ja jeg er ved den nederste.. det er som om fejlen er i denne linie:
if (($databasetid > $tidnu - 24*60*60) && (date("w",$databasetid) == date("w",$tidnu))) {
(det er linie 29 og uanset hvad der kommer efter, er der fejl i linie 30)
Avatar billede Slettet bruger
04. januar 2003 - 03:55 #20
thomase: Prøv engang min funktion, nu er den der jo alligevel :)
Avatar billede broegaard Nybegynder
04. januar 2003 - 03:59 #21
må jeg ikke ser linien før
Avatar billede thomase Nybegynder
04. januar 2003 - 04:02 #22
$monname = array('januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december');
$tidnu = time();
$databasetid = $row_tekst1['tid'];
if (($databasetid > $tidnu - 24*60*60) && (date("w",$databasetid) == date("w",$tidnu))) {
    echo "Idag " . date("G:i",$databasetid);
}
elseif (($databasetid > $tidnu - 48*60*60) && ((date("w",$databasetid) == date("w",$tidnu) -1) || ((date("w",$databasetid) == 6 && date("w",$tidnu) == 0)))) {
    //Igår
    echo "Igår " . date("G:i",$databasetid);
}
elseif (date("Y",$databasetid) == date("Y",$tidnu)) {
    //I år men før i går
    echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1];
}
else {
    // sidste år
    echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1] ." ". date("Y",$databasetid);
}
Avatar billede thomase Nybegynder
04. januar 2003 - 04:06 #23
mercur8 jeg har prøvet din og den laver også parse error... 
Nu ser jeg lige hvad broegaard finder ud af , han kom jo først ;)
Avatar billede Slettet bruger
04. januar 2003 - 04:09 #24
thomase: Det er vist dig, der laver parse error, kan vi konkludere :)
Avatar billede thomase Nybegynder
04. januar 2003 - 04:10 #25
ja jeg er bange for det... aner ikke hvad der er galt
Avatar billede broegaard Nybegynder
04. januar 2003 - 04:14 #26
Jeg må sige at jeg er temlig blank. Den virker fint her.
Hvis du sætter $databasetid = time () - 60*60*24 så virker den fint.
Det som om at det er inputet det er i vejen med men så er det selvfølgelig underligt at den kommer med fejlen der.
Prøv mercur8's istedet for jeg tror ikke jeg kommer meget længere med dette her nu
Avatar billede thomase Nybegynder
04. januar 2003 - 04:18 #27
hmm mercur8 med din er det lidt det samme

ved dette (som linie 1,2 og 3):

$timestamp = $row_tekst1['tid'];
function format_date($timestamp) {
    $now = time();

giver den parse error i linie 3 (!!)
$row_tekst1['tid']; echoer fint nok med 1041644236
Avatar billede Slettet bruger
04. januar 2003 - 04:19 #28
thomase: Det er slet ikke dér du skal rette.

Du skal lade hele funktionen være som den er.

Det eneste du skal ændre er nederste linje. Den skal ændres til:
echo ($date = format_date($row_tekst1['tid'])) ? $date : "Fejl i timestamp";
Avatar billede Slettet bruger
04. januar 2003 - 04:26 #29
Iøvrigt det er ikke i nogle af vores (broegaard eller min) koder, der er parse errors. Så det er altså en fejl, du har i den kode, du har ovenfor vores. Sikkert der hvor du trækker dit timestamp ud af databasen.

Er du i tvivl så sov nogle timer og kig på det igen. Så finder du sikkert din fejl :)

broegaards script indeholder iøvrigt regnefejl, efter han har byttet rundt på rækkefølgen af sine løkker mv.
Avatar billede thomase Nybegynder
04. januar 2003 - 04:28 #30
ja det så jeg også.. er ved at blive sent ;)
men jeg kan stadig ikke parse...

function format_date($timestamp) {
    $now = time();   
    setlocale (LC_ALL, 'da_DK.ISO-8859-1');
   
    # ikke samme aar
    # bemærk! dette check _skal_ vaere foerst da vi ellers laver fejl i de andre funktioner
    if (date('y', $timestamp) != date('y', $now))
        return strftime("%d. %B %Y", $timestamp);
   
    $days_between = date('z', $now) - date('z', $timestamp);
   
    # ældre end igaar
    if ($days_between > 1)
        return strftime("%d. %B", $timestamp);   
       
    # igaar
    if ($days_between == 1)
        return strftime("Igår %H.%M", $timestamp); 
   
    # idag
    if($days_between == 0)
        return strftime("Idag %H.%M", $timestamp);   
    # en dato i fremtiden
    return strftime("Fremtiden %d. %B", $timestamp);   
}
echo ($date = format_date($row_tekst1['tid'])) ? $date : "Fejl i timestamp";

denne her giver fejl i første linie
Avatar billede Slettet bruger
04. januar 2003 - 04:30 #31
Jeg vil nødigt gentage mig selv. Se min sidste kommentar ovenfor.
Avatar billede broegaard Nybegynder
04. januar 2003 - 04:33 #32
"broegaards script indeholder iøvrigt regnefejl, efter han har byttet rundt på rækkefølgen af sine løkker mv. "
Hvor??
Avatar billede thomase Nybegynder
04. januar 2003 - 04:33 #33
jep. jeg kigger på det imorgen med friske øjne
tak for hjælpen
Avatar billede thomase Nybegynder
04. januar 2003 - 04:43 #34
mecur8 jeg tvivler ikke på du har ret i at fejlen er min. her er mit dokument helt fra toppen:

<?php require_once('Connections/SQL.php'); ?>
<?php
$fra = "0";
$pr_side = "1";

mysql_select_db($database_SQL, $SQL);
$query_tekst1 = "SELECT unix_timestamp(dato) as tid, tekst, linktekst, link, id, overskrift FROM mnlnews WHERE picnavn='intet' ORDER BY id DESC limit $fra,$pr_side";
$tekst1 = mysql_query($query_tekst1, $SQL) or die(mysql_error());
$row_tekst1 = mysql_fetch_assoc($tekst1);
$totalRows_tekst1 = mysql_num_rows($tekst1);
?>
<?php
function format_date($timestamp) {
    $now = time();   
    setlocale (LC_ALL, 'da_DK.ISO-8859-1');
   
    # ikke samme aar
    # bemærk! dette check _skal_ vaere foerst da vi ellers laver fejl i de andre funktioner
    if (date('y', $timestamp) != date('y', $now))
        return strftime("%d. %B %Y", $timestamp);
   
    $days_between = date('z', $now) - date('z', $timestamp);
   
    # ældre end igaar
    if ($days_between > 1)
        return strftime("%d. %B", $timestamp);   
       
    # igaar
    if ($days_between == 1)
        return strftime("Igår %H.%M", $timestamp); 
   
    # idag
    if($days_between == 0)
        return strftime("Idag %H.%M", $timestamp);   
    # en dato i fremtiden
    return strftime("Fremtiden %d. %B", $timestamp);   
}
echo ($date = format_date($row_tekst1['tid'])) ? $date : "Fejl i timestamp";
?>

den melder fejl i den linie der indeholder $now = time();
jeg går i seng nu, og kigger videre på det imorgen.
Avatar billede Slettet bruger
04. januar 2003 - 05:02 #35
PRÆCIS hvilken fejl/warning/notice whatever får du.

Hvad er HELE indholdet af SQL.php?
Avatar billede broegaard Nybegynder
04. januar 2003 - 13:03 #36
mercur8: vil du ikke gerne fortælle mig hvad der er galt med mit script
Avatar billede Slettet bruger
04. januar 2003 - 15:14 #37
broegaard: Prøv fx. time() + 615000000; Det skriver den er igaard.
Avatar billede thomase Nybegynder
04. januar 2003 - 15:28 #38
Jeg fik Broegaards til at virke efter at have rodet med begge i lang tid.

$monname = array('januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december');
$tidnu = time();
$databasetid = $row_tekst1['tid'];
if (($databasetid > $tidnu - 24*60*60) && (date("w",$databasetid) == date("w",$tidnu))) {
echo "Idag " . date("G:i",$databasetid);
}
elseif (($databasetid > $tidnu - 48*60*60) && (date("w",$databasetid) == date("w",$tidnu) -1) || (date("w",$databasetid) == 6 && date("w",$tidnu) == 0)) {
echo "Igår " . date("G:i",$databasetid);
}
elseif (date("Y",$databasetid) == date("Y",$tidnu)) {
echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1];
}
else {
echo date("j",$databasetid).". ".$monname[date("n",$databasetid)-1] ." ". date("Y",$databasetid);
}

jeg lavede de forskellige værdier om til variable som jeg indsatte isteder for at gøre det mere overskueligt... da detr så virkede satte jeg værdierne tilbage igen, også virkede det... mærkeligt
det er vist kun i første elseif jeg har ændret på parenteserne , men i den første der gav fejl før, kan jeg ikke se hvad jeg har ændret... kan der gå noget galt med mellemrum eller noget ved copy/paste?
anyway det virker nu.. HURRA

men er der en fejl i? jeg har kun testet bagud i tiden, og er ikke stødt på noget??
Avatar billede broegaard Nybegynder
04. januar 2003 - 16:41 #39
Fejlen er kun hvis database tiden er en gang i frem tiden.
Det er selvfølgelig en fejl men jeg går ud fra at tiden fra databasen er tidspunktet for hvornår en post el. lign. er blevet postet og derfor vil databasetiden altid være mindre end $tidnu og der for vil det ikke give problemer
Avatar billede broegaard Nybegynder
04. januar 2003 - 16:41 #40
mercur8: vil du have nogle point??
Avatar billede Slettet bruger
04. januar 2003 - 17:00 #41
broegaard: Ellers tak :)
Avatar billede thomase Nybegynder
04. januar 2003 - 18:16 #42
så siger jeg tak for hjælpen ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester