PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tage bis zum Geburtstag berechnen



lorglas
21.04.2005, 19:42
Hallo zusammen,

ich möchte gerne die restlichen vom aktuellen Datum bis zum nächsten Geburtstag berechnen.
Ich habe das so Versucht, aber dabei kommt nicht heraus.

ThisBirthday=$(catattr META:birthday "$ThisPerson" | cut -f3 -d: )

datum=$(date +%d.%m.%Y)

resttage=$(expr `date -d "$datum" "+%s"` - `date -d "$ThisBirthday" "+%s"`) / 86400

Der Geburtstag (ThisBirthday enthält z.b. 16.04.1979) und das Datum werden ganz normal angezeigt 21.04.2005, hat jemand eine Lösung für mich.

Gruß Lorglas

www.besly.mittilgart.de
:hilfe2:

proggi
21.04.2005, 22:55
Ich weiß jetzt nicht, ob das mit Shellscripts möglich ist (ich code nur PHP), aber man könnte doch einen Timestamp aus dem Datum machen und dann den größeren minus den kleinerer (oder andersrum, hauptsache es ist der absolute Wert), ergibt die Differenz und dann kannste da ja sicher mit einer Shellfunktion den Tag auslesen.

Verstehst du was ich meine?

MrFenix
21.04.2005, 23:50
Hier mal ein C++ Programm was ich geschrieben hab dazu:
timeofterror.cpp:


#include <time.h>
#include <iostream>
#include <cstdlib>
#include "conv.h"

using namespace std;

int main(int argc, char * argv[]) {



tm olddate, newdate;
time_t now, then;
double diff =0;

if (strcmp(argv[1], "-f") == 0) {
char * buf = (char*)calloc(100, sizeof(char));

strncpy(buf, getenv("HOME"), 90);
strcat(buf, "/.tot");

FILE * handle = fopen(buf, "r");

if (handle == 0) {
cout << "error: unable to read " << buf << " !" << endl;
return -1;
}

free(buf);
buf = (char*)calloc(100, sizeof(char));
fread(buf, 1, 100, handle);

if (strptime(buf, "%D %H:%M:%S", &olddate) == 0) {
cout << "error: invalid date or format! (must be mm/dd/yy h:m:s)" << endl;
return -1;
}

} else if (argc != 3) {
cout << "usage: tot \"date\" <format>" << endl;
return -1;
} else {
if (strptime(argv[1], argv[2], &olddate) == 0) {
cout << "error: invalid date or format!" << endl;
return -1;
}
}

time(&now);
then = mktime(&olddate);
diff = difftime(now, then);

int years, days, hours, minutes, seconds, remainder;

years = (int)diff / 31536000;
remainder = (int)diff % 31536000;
days = remainder / 86400;
remainder = remainder % 86400;
hours = remainder / 3600;
remainder = remainder % 3600;
minutes = remainder / 60;
seconds = remainder % 60;

cout << years << " Years " << days << " Days " << hours << " Hours " << minutes << " Minutes " << seconds << " Seconds" << endl;



return 0;

}

conv.h:


#include "string.h"
#include "math.h"

double strtodouble(char* str) {

long int fl, efl, e, mf;
unsigned long int i, k;
double outp=0;

fl = 0;
efl = 0;
e = 0;
mf = 1;


char numbers[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

for (i=0; i<strlen(str); i++) {

for (k = 0; k < strlen(numbers); k++) {


if (str[i] == '.') {
fl = 10;
}

if (str[i] == 'e' || str[i] == 'E') {
efl = 1;
e = 0;
}


if (str[i] == '-' && efl == 1) {
efl = -1;
e = 0;
} else if (str[i] == '-' && efl == 0) {
mf = -1;
}


if (numbers[k] == str[i]) {

if (efl != 0) {
e = (e * 10) + k;
} else {

if (fl == 0) {
outp = (outp * 10) + k;
}

if (fl > 0) {
outp = outp + (double)k / (double)fl;
fl = fl * 10;
}
}
}


}
}
e = efl * e;

outp = mf * outp * pow(10, e);
return outp;
}


Mag teilweise unsauber sein und man macht das mit den .h Dateien nicht in der Weise und ach ja ich weiß, dass es dafür funktionen gibt, aber ich hasse einfach alles was mit atoi, atof, töftöf usw. zu tun hat :devil:

EDIT: bedient man z.B. mit
Fenix@Fenix Backup $ ./tot "03/19/04 20:00:00" "%D %H:%M:%S"

TenBaseT
22.04.2005, 19:33
Nur eine Idee: gibt es ein Programm, welches das UNIX Datum in das DOS Format umrechnen kann? Bekanntlich isz ja der ganzzahlige anteil die Tage, die seit dem 1.1.1900 vergangen sind. Der Nachkommanteil (Sekunden seit Mitternacht) kann vernachlässigt werden.

Hans

rup
25.04.2005, 13:40
So sollte es in etwa gehen:



Birthday="25 Dec 2006"
echo "(`date -d "$Birthday" +%s` - `date +%s`) / 86400" |bc


Gruss Rupert