webForumDet fria alternativet

Datum

10 svar · 232 visningar · startad av Kent

KentMedlem sedan juli 2000359 inlägg
#1

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

Peter_BMedlem sedan apr. 2000595 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

JojoxxMedlem sedan juni 20004 306 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

KentMedlem sedan juli 2000359 inlägg
#4

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

HansenMedlem sedan aug. 2000383 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]

HansenMedlem sedan aug. 2000383 inlägg
#6

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

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

JojoxxMedlem sedan juni 20004 306 inlägg
#7

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

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

HansenMedlem sedan aug. 2000383 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

orvarMedlem sedan feb. 2001109 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...

KarlTomasMedlem sedan okt. 2000547 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...

HansenMedlem sedan aug. 2000383 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

Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb