Schrift
[thread]8933[/thread]

Kleines Rechenproblem mit Date::Calc: Will einen Monat von heute zurückrechnen

Leser: 2


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
krusty
 2007-04-20 15:46
#76068 #76068
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

habe ein kleines Problem. Ich schreibe gerade ein Script das zum 1. eines jeden Monats ausgeführt werden soll. Dazu verwende ich die crontab des Servers. Jetzt muss ich aber genau einen Monat zurückrechnen und den Timestamp in einer Variablen speichern. Diesen brauche ich nämlich um einen MySQL Befehl absetzen zu können der mir einen Durchschnittswert liefert von dem vergangenen Monat.

So das aktuelle Datum ermittle ich mit folgenden Zeilen:
Code: (dl )
1
2
3
my ($sec,$min,$hour,$day,$month,$year) = (localtime)[0..5];
$month++;
$year+=1900;


Nun habe ich bei CPAN nachgeschaut ob ich mit dem Modul Date::Calc soetwas hin bekomme. Vielleicht habe ich die entsprechende Funktion nur übersehen oder nicht richtig verstanden. Auf jeden Fall bin ich nicht fündig geworden. Hat jemand von euch eine Idee wie ich genau einen Monat zurückrechnen kann?
Man könnte sicherlich den Wert aus $month nehmen und eins abziehen. Natürlich vorher prüfen ob $month gleich 1 ist, dann den wert von $month2 auf 12 setzten und gut ist. Aber gibt es nicht auch eine Funktion dafür?
renee
 2007-04-20 15:57
#76069 #76069
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
use Date::Calc qw(Add_Delta_YM);

my ($day,$month,$year) = (localtime)[3..5];
$month++;
$year+=1900;
my ($n_year,$n_month,$n_day) = Add_Delta_YM($year,$month,$day, 0,1);
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/
renee
 2007-04-20 16:04
#76070 #76070
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mit CPAN:Date::Manip sollte es auch gehen:
Code (perl): (dl )
1
2
3
use Date::Manip;

my ($newdate) = DateCalc("today", "- 1month");
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/
krusty
 2007-04-20 16:12
#76071 #76071
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Ich habe das jetzt so gemacht.

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

use warnings;
use strict;
use Time::Local;
use Date::Calc qw(Add_Delta_YMD);

my ($sec,$min,$hour,$day,$month,$year) = (localtime)[0..5];
$month++;
$year+=1900;
print "Debug: $sec, $min, $hour, $day, $month, $year\n";

my ($Dy, $Dd) = 0;
my $Dm = 1;
my ($year2, $month2, $day2) = Add_Delta_YMD($year, $month, $day, $Dy, -$Dm, $Dd);
print "Debug: $sec, $min, $hour, $day2, $month2, $year2\n";


Wenn ich das Script dann ausführe bekomme ich in der Ausgabe zwar das richtige Ergebnis, aber bekomme gleichzeitig noch eine Fehlermeldung.
Code: (dl )
Use of uninitialized value in subroutine entry at ./test.pl line 15.


Kannst du mir erklären woher der Fehler kommt?\n\n

<!--EDIT|krusty|1177071215-->
vayu
 2007-04-20 16:23
#76072 #76072
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
jo $Dd ist ja nicht initialisiert

Code (perl): (dl )
1
2
3
my ($Dy, $Dd) = 0;
my $Dm = 1;
my ($year2, $month2, $day2) = Add_Delta_YMD($year, $month, $day, $Dy, -$Dm, $Dd);


musst hier:
my ($Dy, $Dd) = (0,0);

schreiben wenn du beide auf 0 setzen willst
renee
 2007-04-20 16:32
#76073 #76073
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
my ($Dy, $Dd) = 0;


muss
Code: (dl )
my ($Dy, $Dd) = (0,0);
heißen.

Edit: vayu war schneller (blöd wenn man zwischen Aufruf des Threads und Antwort noch schnell was machen muss ;) )\n\n

<!--EDIT|renee|1177072420-->
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/
krusty
 2007-04-20 16:33
#76074 #76074
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
@vayu, danke habe ich total vergessen. :(

Das Script sieht jetzt so aus.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use warnings;
use strict;
use Time::Local;
use Date::Calc qw(Add_Delta_YM);

my ($sec,$min,$hour,$day,$month,$year) = (localtime)[0..5];
$month++;
$year+=1900;
print "Debug: $day, $month, $year\n";

my ($year2,$month2,$day2) = Add_Delta_YM($year,$month,$day,0,-1);

print "Debug: $day2, $month2, $year2\n";

my $time_now = timelocal(1, 0, 0, $day, $month, $year);
my $time_old = timelocal(1, 0, 0, $day2, $month2, $year2);
print "Debug: $time_now\n";
print "Debug: $time_old\n";


Die Ausgabe gibt mir folgendes.
Code: (dl )
1
2
3
4
Debug: 20, 4, 2007
Debug: 20, 3, 2007
Debug: 1179612001
Debug: 1177020001


Wenn ich jetzt den Timestamp wieder zurückrechne bekomme ich für den ersten Wert 00:00:00 20-05-2007 sollte aber eigentlich April sein und nicht Mai. Genauso beim zweiten Wert. Ist April sollte aber März sein. Siehe die ersten beiden Debug Werte. Warum wirft der das durcheinander?
renee
 2007-04-20 16:35
#76075 #76075
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst ja auch wieder 1 bei den Monaten abziehen (das was Du nach localtime vorher draufgerechnet hast)...
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/
krusty
 2007-04-20 16:39
#76076 #76076
User since
2006-01-27
91 Artikel
BenutzerIn
[default_avatar]
Das macht doch keinen Sinn.
Ich kann aber nicht einfach 1 abziehen, dann muss ich ja so oder so prüfen ob der monat 1 ist, und dann entsprechend auf 12 setzten. Ist doch doof.
vayu
 2007-04-20 16:40
#76077 #76077
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
[quote=renee,20.04.2007, 14:32]
Edit: vayu war schneller (blöd wenn man zwischen Aufruf des Threads und Antwort noch schnell was machen muss ;) )[/quote]
kenn ich doch irgendwoher ^^\n\n

<!--EDIT|vayu|1177072833-->
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2007-04-20 15:46.