Tage bis zum Geburtstag berechnen

L

lorglas

Grünschnabel
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:
 
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?
 
Hier mal ein C++ Programm was ich geschrieben hab dazu:
timeofterror.cpp:
Code:
#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:
Code:
#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"
 
Zuletzt bearbeitet:
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
 
So sollte es in etwa gehen:

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

Gruss Rupert
 
Zuletzt bearbeitet:

Ähnliche Themen

Skript - letzten Samstag im Monat

Last mit etc/passwd anzeigen lassen

tar network backup problem

Mit Picasa vergebene Tags aus jpg-Dateien auslesen

Letzten Tag löschen

Zurück
Oben