Hur får man fram ett datum som ser ut så här: 2001-07-03
Datum
10 svar · 232 visningar · startad av Kent
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
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
Tack för de snabba svaren,
verkar funka fint båda koderna :)
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 ||= time();
$template ||= '%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]
Laddade upp script/funktion här: http://freebox.com/c.h/perl/FormatDate.pl.txt
------------------
Hansen
c.h@ngmedia.com
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
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...
Ä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...
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