webForumDet fria alternativet

Datum

Programmeringur Perl, Python, Ruby och övrig CGI

10 svar · 232 visningar · startad av Kent

Medlem sedan juli 2000355 inlägg
Frågan#1

Hur får man fram ett datum som ser ut så här: 2001-07-03

Medlem sedan apr. 2000642 inlägg
#2

få se, jag brukar göra såhär:

open (IN_DATE, "date +%Y-%m-%d |");
$date = <IN_DATE>;
close (IN_DATE);

jag vet att det går att skriva snyggare som

$date = ´date +%y-%m-%d´;

visserligen.. kolla in "man date" för hur du kan skapa fler format :)

------------------
PeterSign v 2.3.36

Medlem sedan juni 20004 308 inlägg
#3

Eller lite mer plattformsoberoende;

my @time=localtime(time);
$time[3]='0'.$time[3] if($time[3]<10);
$time[4]++; $time[4]='0'.$time[4] if($time[4]<10);
$time[5]+=1900;
$date = "$time[5]-$time[4]-$time[3]";

------------------
/ J

Medlem sedan juli 2000355 inlägg
#4

Tack för de snabba svaren,
verkar funka fint båda koderna :)

Medlem sedan aug. 2000374 inlägg
#5

Jag brukar använda Date::Format som finns i TimeDate den ger ungefär samma möjligheter som finns i *nix date fast helt plattformsoberoende :)

Vill du inte förlita dig på en extern modul, kan du använda den här funktionen:

#!/usr/bin/perl -w

use strict;

sub FormatDate {

# FormatDate( <Mall>, <Språk>, <Tid> );
#
#  År
#    %yy    två sissta siffrorna.
#    %yyyy  alla fyra siffrorna.
#
#  Månad
#    %m     siffror utan inledande nolla.
#    %mm    siffror med inledande nolla.
#    %mmm   förkortning av månadens namn.
#    %mmmm  månadens namn.
#
#  Dag
#    %d     siffror utan inledande nolla.
#    %dd    siffror med inledande nolla.
#    %ddd   förkortning av dagens namn.
#    %dddd  dagens namn.
#
#  Timmar
#    %h     12-timmars format utan inledande nolla.
#    %hh    12-timmars format med inledande nolla.
#    %H     24-timmars format utan inledande nolla.
#    %HH    24-timmars format med inledande nolla.
#
#  Minuter
#    %M     utan inledande nolla.
#    %MM    med inledande nolla.
#
#  Sekunder
#    %S     utan inledande nolla.
#    %SS    med inledande nolla.
#
#
#  Exempel:
#
#    2001-01-01                 '%yyyy-%mm-%dd'
#    2001-01-01 12:00:00        '%yyyy-%mm-%dd %H:%M:%S'
#    Måndag den 1 Januari 2001  '%dddd den %d %mmmm %yyyy'
#    1 Januari 2001             '%d %mmmm %yyyy'

    my ( $template, $lang, $ctime ) = @_;

    my %language = (
      de => {
          days => [
              'Sonntag',    'Montag',  'Dienstag', 'Mittwoch',
              'Donnerstag', 'Freitag', 'Samstag'
          ],
          months => [
              'Januar',    'Februar', 'März',     'April',
              'Mai',       'Juni',    'Juli',     'August',
              'September', 'Oktober', 'November', 'Dezember'
          ],
      },
      en => {
          days => [
              'Sunday',   'Monday', 'Tuesday', 'Wednesday',
              'Thursday', 'Friday', 'Saturday'
          ],
          months => [
              'January',   'February', 'March',    'April',
              'May',       'June',     'July',     'August',
              'September', 'October',  'November', 'December'
          ],
      },
      sv => {
          days => [
              'Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag',
	      'Fredag', 'Lördag'
          ],
          months => [
              'Januari',   'Februari', 'Mars',     'April',
              'Maj',       'Juni',     'Juli',     'Augusti',
              'September', 'Oktober',  'November', 'December'
          ],
      },
    );

    $ctime &#0124;&#0124;= time();
    $template &#0124;&#0124;= '%yyyy-%mm-%dd';
    $lang = defined($lang) ? defined( $language{$lang} ) ? $lang : 'en' : 'en';

    my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime($ctime);

    my $newhour = ( $hour > 12 ) ? $hour - 12 : ( $hour == 0 ) ? 12 : $hour;

    my %date = (
      d    => $mday,
      dd   => ( $mday < 10 ) ? "0$mday" : $mday,
      ddd  => substr( @{ $language{$lang}{'days'} }[$wday], 0, 3 ),
      dddd => @{ $language{$lang}{'days'} }[$wday],
      m    => $mon + 1,
      mm   => ( ( $mon + 1 ) < 10 ) ? "0" . ( $mon + 1 ) : ( $mon + 1 ),
      mmm  => substr( @{ $language{$lang}{'months'} }[$mon], 0, 3 ),
      mmmm => @{ $language{$lang}{'months'} }[$mon],
      S    => $sec,
      SS   => ( $sec < 10 ) ? "0$sec" : $sec,
      M    => $min,
      MM   => ( $min < 10 ) ? "0$min" : $min,
      h    => $newhour,
      H    => $hour,
      hh   => ( $newhour < 10 ) ? "0$newhour" : $newhour,
      HH   => ( $hour < 10 ) ? "0$hour" : $hour,
      yy   => substr( 1900 + $year, 2, 2 ),
      yyyy => 1900 + $year,
      tt   => ( $hour > 12 ) ? "PM" : "AM",
    );

    $template =~ s/%([a-zA-Z]+)/{ defined( $date{$1} ) ? $date{$1} : "%$1" }/eg;

    return $template;
}

print
  FormatDate(), "\n",
  FormatDate( '%d %mmmm %yyyy' ), "\n",
  FormatDate( '%d %mmmm %yyyy', 'sv' ), "\n",
  FormatDate( '%dddd den %d %mmmm %yyyy', 'sv', 978346800 ), "\n";

------------------
Hansen
c.h@ngmedia.com

[Redigerat av Hansen den 05 jul 2001]

Medlem sedan aug. 2000374 inlägg
#6

Laddade upp script/funktion här: http://freebox.com/c.h/perl/FormatDate.pl.txt

------------------
Hansen
c.h@ngmedia.com

Medlem sedan juni 20004 308 inlägg
#7

Kanske lite mycket kod bara för att få ett datum i åååå-mm-dd format... :)

------------------
/ J

Medlem sedan aug. 2000374 inlägg
#8

Det är sant men så klarar ju funktionen mer än bara åååå-mm-dd.

Ska man bara använda ett format på datumet tycker jag att din lösning fungerar utmärkt.

Vill man ha en flexibel datumfunktion i sitt kodbibliotek så tycker jag att min funktion fungerar bra.

Hoppas att någon får gjädje av min lilla kodsnutt :)

------------------
Hansen
c.h@ngmedia.com

Medlem sedan feb. 2001105 inlägg
#9

har ingen som helst kunskap om cgi eller perl men jag behöver ett datum script i cgi så jag försökte mig på det här långa scriptet ändå. Men det blir lite fel. Jag bara kopierar över koden till en textfil och döper den till datum.cgi (provade med .pl först men då fick jag ett "sidan kan inte visas fel"). När jag kollar på filen i browsern får jag följande meddelande:

CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

2001-08-07
7 August 2001
7 Augusti 2001
Måndag den 1 Januari 2001

Vad ska jag göra för att få det rätt?

------------------
Musiken var människans, störningarna naturens...

Medlem sedan okt. 2000885 inlägg
#10

Är ganska novis på perl, men du kanske behöver skriva in:

print "content-type: text/html\n\n";

------------------
Sprit löser inga problem, men det gör inte mjölk heller...

Medlem sedan aug. 2000374 inlägg
#11

om du ändrar print satsen till:

print
  "Content-Type: text/html\n\n",
  FormatDate(), "\n",
  FormatDate( '%d %mmmm %yyyy' ), "\n",
  FormatDate( '%d %mmmm %yyyy', 'sv' ), "\n",
  FormatDate( '%dddd den %d %mmmm %yyyy', 'sv', 978346800 ), "\n";

Så ska det nog lösa sig.

------------------
Hansen
c.h@ngmedia.com

142 ms totalt · 3 externa anrop · v20260731065814-full.b746b907
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)