Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7880[/thread]

timestamp problem: mit der funktion timelocal

Leser: 4


<< >> 6 Einträge, 1 Seite
galaxy
 2006-04-12 12:51
#64752 #64752
User since
2006-04-03
30 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe eine Problem mit meiner Umrechnung von Daten zu Timestamps und umgekehrt.

Folgender Sachverhalt: Ich lese ein Datum aus meiner Datenbank aus. Dieses Datum liegt mit in Perl als ein String der Form DD-MM-YYYY vor. Das soll das Datum sein, ab dem später Dateien in die Datenbank geladen werden soll.

Anschliessend kommt eine while-Schleife, welche die entsprechenden Daten in die Datenbank laden soll.

Bis jetzt wird in dieser while-Schleife das Datum aber nur von Perl "simuliert" hochgezählt. Genau da liegt das Problem:

Anfangsdatum aus der Datenbank ist 17-10-2005. Dieses wandele ich so in den Timestamp um:
Code: (dl )
1
2
3
4
my ($day,$month,$year,) = split(/-/,$history_tradedate);
# Creates the timestamp(often have to write -1 because many date functions
# start with 0 for fist month, day etc.)
my $history_in_unixtime = timelocal("00","00","00",$day,$month-1,$year);


Des weiteren erzeuge ich mir den timestamp des heutigen Datums:

Jetzt folgt die while Schleife welche alle Daten bis heute laden soll: (vergelich timestamp heut und timestamp db)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while ($unix_today_minus_x > $history_in_unixtime)
{

hier kommt später code hin




 $history_tradedate = strftime ("%d-%m-%Y",localtime($history_in_unixtime));

 print "history datum: ".$history_tradedate."\n";


 ($day,$month,$year,) = split(/-/,$history_tradedate);
 print "day: ".$day."\n";

 # Creates the timestamp(often have to write -1 because many date functions
 # start with 0 for fist month, day etc.)
 $history_in_unixtime = timelocal("00","00","00",$day+1,$month-1,$year);

 $history_tradedate = strftime ("%d-%m-%Y",localtime($history_in_unixtime));
  print "history datum: ".$history_tradedate."\n";
} #


um jetzt testen zu können (und nicht in eine Endlosschleife zu laufen) will ich das Datum in der Schleife immer um einen Tag hochzählen. Jedoch taucht dabei folgendes Problem auf.

Das hochzählen funktioniert bis zum 31-10-2005 einwandfrei. Dachte er würde dann zum 01-11-2005 umspringen. Das macht er aber nicht, sondern springt zum 32ten und schreibt folgende Fehlermeldung:

Day 32 out of range 1 .. 31 ...

Kann mir jemand bei der Monats- bzw. jahresübergreifenden Umwandlung helfen?

Danke für Tipps\n\n

<!--EDIT|galaxy|1144832252-->
renee
 2006-04-12 13:07
#64753 #64753
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde mit CPAN:Date::Calc arbeiten, da kannst Du Tage hinzuzählen und es wird alles richtig beachtet (auch Schaltjahre).
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Relais
 2006-04-12 14:22
#64754 #64754
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde CPAN:DateTime vorschlagen, das ist der Mainstream-Weg, hat auch diese "delta"-Methoden. Ich benutze beide Module, aus historischen Gerümpel, das sollte man ja eigentlich nicht.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
galaxy
 2006-04-12 17:03
#64755 #64755
User since
2006-04-03
30 Artikel
BenutzerIn
[default_avatar]
Hallo,

Habe mir mal das Modul Date::Calc installiert. Jedoch verstehe ich nicht wie ich damit jetzt Timestamps erzeugen/ Tage hinzuzählen kann. Kann mir jemand ein Beispiel nennen?

Danke für Tipps
renee
 2006-04-12 17:20
#64756 #64756
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
use Date::Calc qw(Add_Delta_Days);
use Time::Local;

my $date = '31.01.2005';
my ($day,$month,$year) = split(/\./,$date);
($day,$month,$year) = Add_Delta_Days($day,$month,$year,1);

my $timestamp = timelocal(0,0,0,$day,$month-1,$year-1900);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2006-04-12 18:41
#64757 #64757
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
perldoc Date::Calc =)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 6 Einträge, 1 Seite



View all threads created 2006-04-12 12:51.