Schrift
[thread]3319[/thread]

timestamp (Seite 2)



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
jan10001
 2003-08-26 23:19
#32079 #32079
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Quote
pq

damit kann man immer noch nix anfangen. deine aussage:
du hast substr() benutzt und herausgekommen ist 26.0826.2003.
und darauf erwartest du eine antwort, was du falsch gemacht
haben könntest?

Zumindest bei substr() war ich mir keines Fehlers bewußt, mit Tag und Jahr lief es in vielen Variationen, nur bei Monat kam immer nur Mist.
Code: (dl )
1
2
3
4
Das war einer meiner vielen Versuche:
my $jahr = substr($datum, 0,4);
my $monat = substr($datum, 4,6);
my $tag = substr($datum, 6,8);

Und beim zusammensetzen der Skalare gab es bestimmt keinen Fehler.
Also stellte ich die Frage "Wie muß ich das machen?" und setzte das mit substr in die Klammern damit klar wurde das dieser Weg anscheinend nicht geht.



Quote
strat

es gibt auch schnellere wege:
Code (perl): (dl )
my ($year, $month, $day) = unpack("A4 A2 A2", $date);

oder noch besser:
Code (perl): (dl )
my ($year, $month, $day) = unpack("J4 J2 J2", $date);


seltsam, dass die Leute hier kein unpack fuer fixe satzlaengen moegen...

Der Code mit den A's geht bei den J's gibt es einen Fehler.

So jetzt ersteinmal danke für die Hilfe.
Grüße,
Jan
pq
 2003-08-26 23:56
#32080 #32080
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=jan10001,26.08.2003, 21:19]Zumindest bei substr() war ich mir keines Fehlers bewußt, mit Tag und Jahr lief es in vielen Variationen, nur bei Monat kam immer nur Mist.
Code: (dl )
1
2
3
4
Das war einer meiner vielen Versuche:
my $jahr = substr($datum, 0,4);
my $monat = substr($datum, 4,6);
my $tag = substr($datum, 6,8);
[/quote]
perldoc -f substr:
      substr EXPR,OFFSET,LENGTH,REPLACEMENT
      substr EXPR,OFFSET,LENGTH
      substr EXPR,OFFSET

das dritte argument ist die länge, nicht der index.
also:
my $jahr = substr($datum, 0,4);
my $monat = substr($datum, 4,2);
my $tag = substr($datum, 6,2);
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
jan10001
 2003-08-27 00:15
#32081 #32081
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Danke,
hätte wohl zusätzlich in die perldoc schauen sollen, das hätte mir einiges erspart. :(
Naja ich sehe es positiv, immerhin hab ich heute etliche andere Methoden gesehen, die interessant sind. :)
Shagreen
 2003-08-27 01:30
#32082 #32082
User since
2003-08-14
88 Artikel
BenutzerIn
[Homepage] [default_avatar]
Falls Du die Arbeit MySQL übertragen kannst, ist auch
[sql]SELECT DATE_FORMAT(Spalte, "%d.%m.%Y");
[/sql]
möglich
jan10001
 2003-08-27 12:14
#32083 #32083
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Interessante Möglichkeit, aber das überlasse ich lieber der Anwendung. Danke
Ronnie
 2003-08-27 12:24
#32084 #32084
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Falls du das ganze mal rückwärts brauchst (Eingabe in die DB):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl -w

use strict;

my $date = "17/08/2003 17:19";
$date =~ s/\s+/ /go;

unless ($date eq 'NOW()') { $date = 'NOW()' if (substr($date,0,2) > 31); }
unless ($date eq 'NOW()') { $date = 'NOW()' if (substr($date,3,2) > 12); }
unless ($date eq 'NOW()') { $date = 'NOW()' if (substr($date,6,4) < 2003); }

unless ($date eq 'NOW()') {
if ($date =~ m/^(\d{2})\D(\d{2})\D(\d{4})\s+(\d{2})\D(\d{2})$/) {
$date =~ s/^(\d{2})\D(\d{2})\D(\d{4})\s+(\d{2})\D(\d{2})$/$3$2$1$4$5/o;
$date = $date.'00';
}
else { $date = 'NOW()'; }
}

print $date."\n";


Das alles um zu gewährleisten das man 'ne sinnvolle Eingabe in die Datenbank bekommt.

Gruss,
Ronnie
jan10001
 2003-08-27 12:59
#32085 #32085
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Danke.
Ich habe timestamp gewählt um Änderungen zu erfassen. Das Schöne an einer timestamp Spalte ist, das mit jeder Änderung der Zeile das Datum automatisch gesetzt wird.
Grüße,
Jan
SirLant
 2003-08-27 13:12
#32086 #32086
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Strat, was bedeutet das A und das J bei dem unpack?
Und wenn unpack und pack so unterschätzt werden,
sollte jemand (DU :)) schnellstens nen Tutorial für
diese beiden Funktionen schreiben :)
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Strat
 2003-08-27 13:44
#32087 #32087
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=SirLant,27.08.2003, 11:12]Strat, was bedeutet das A und das J bei dem unpack?
Und wenn unpack und pack so unterschätzt werden,
sollte jemand (DU :)) schnellstens nen Tutorial für
diese beiden Funktionen schreiben :)[/quote]
also pack und unpack sind die Perl-Internen Mittel erster Wahl, wenn es um Daten mit fixen Satzlaengen geht, oder auch die Konvertierungen von Zeichenketten (z.B. little-endian <=> big_endian)

pack liefert einen String zurueck und erwartet als ersten Parameter eine Formatanweisung und als zweiten eine Liste.
unpack geht den umgekehrten Weg und gibt eine Liste zurueck, und erwartet als ersten Parameter eine Formatanweisung und als zweiten einen String.

Die Formatanweisung besteht aus mehreren Paaren der Form:
Format Laenge, z.B.
Code (perl): (dl )
print pack("A20 A30 A10", $var1, $var2, $var3);

Es gibt z.B. die Variable $var1 linksbuendig auf zwanzig Zeichen aus (und schneidet im Gegensatz zu (s)printf auch ab, wenn $var1 zu lang ist), danach $var2 auf der laenge von 30 und dann $var3 auf der Laenge von 10

Folgende Formatanweisungen werden haeufig verwendet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
A  ein ASCII-String, mit Leerzeichen aufgefuellt
Z ein mit NULL terminierter String (ASCIZ)
b Bitstring (aufsteigende Bitanordnung, wie z.B. vec)
B Bitstring (absteigende Bitanordnung)
h Hex-String (niedriegste Stelle zuerst)
H Hex-String (hoechste Stelle zuerst)
i Integer mit Vorzeichen
I Integer ohne Vorzeichen
j Integer mit Vorzeichen von Perl (IV)
J Integer ohne Vorzeichen von Perl (UV)
u ein uuencodeter String
U eine Unicode Zeichennummer
w eine BER-komprimierte Integer
x ueberspringe anzahl bytes

Es gibt noch einige weitere, die man aber nur in Spezialfaellen braucht: siehe perldoc -f pack

Beispiel:
Code: (dl )
1
2
3
4
5
6
my $time = localtime(time); print "$time\n";
my ($wday, $month, $day, $time, $year) = unpack("A3 x1 A3 x1 A2 x1 A8 x1 A4", $time);
print "$wday, $day.$month.$year, $time\n";
^Z
Wed Aug 27 11:43:02 2003
Wed, 27.Aug.2003, 11:43:02
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Dubu
 2003-08-28 13:07
#32088 #32088
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ich empfehle perlpacktut.
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2003-08-26 21:48.