strptime in c mit Zeitzone offsets
Ich habe Probleme, einen Weg zu finden, analysieren Sie die Zeitzone aus strings wie die folgenden:
"Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"
Was ich tun muss, in den größeren Plan der mein Programm ist in eine char* - und wandeln Sie es in ein time_t.
Das folgende ist ein einfaches test-Programm, das ich schrieb, um zu versuchen und herausfinden, ob strptime war die Buchhaltung für die Zeitzone, und es scheint nicht zu sein (wenn dieser test Programm führt alle gedruckten zahlen sind die gleichen, wenn Sie sollten sich unterscheiden). Vorschläge?
Ich habe auch versucht, die Verwendung von GNU getdate und getdate_r, denn das sieht aus wie eine bessere option für möglicherweise in flexible Formate, aber ich habe eine "implizite Funktionsdeklaration" Warnung vom compiler, was ich nicht war, einschließlich der richtigen Bibliotheken. Gibt es etwas anderes, ich sollte #include-ing zu verwenden getdate ?
#include <string.h>
#include <stdlib.h>
#include <strings.h>
#include <stdio.h>
#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <time.h>
int main (int argc, char** argv){
char *timestr1, *timestr2, *timestr3;
struct tm time1, time2, time3;
time_t timestamp1, timestamp2, timestamp3;
timestr1 = "Thu, 1 Sep 2011 09:06:03 -0400 (EDT)"; //-4, and with timezone name
timestr2 = "Thu, 1 Sep 2011 09:06:03 -0000"; //-0
strptime(timestr1, "%a, %d %b %Y %H:%M:%S %Z", &time1); //includes UTC offset
strptime(timestr2, "%a, %d %b %Y %H:%M:%S %Z", &time2); //different UTC offset
strptime(timestr1, "%a, %d %b %Y %H:%M:%S", &time3); //ignores UTC offset
time1.tm_isdst = -1;
timestamp1 = mktime(&time1);
time2.tm_isdst = -1;
timestamp2 = mktime(&time2);
time3.tm_isdst = -1;
timestamp3 = mktime(&time3);
printf("Hello \n");
printf("%d\n%d\n%d\n", timestamp1, timestamp2, timestamp3);
printf("Check the numbers \n");
return 0;
}
- Ich bin mir nicht sicher, Sie sollten mit den
#endif
Richtlinie nach der Definition__USE_XOPEN
, versuchen Sie, ihn nach#include <time.h>
- Sollten Sie sich niemals definieren
__USE_XOPEN
. Dies ist ein internes makro von der glibc-header-Umsetzung, automatisch festgelegt basierend auf dem Vorhandensein/der Wert der_XOPEN_SOURCE
makro. - ändern der Reihenfolge von #endif scheint nicht, einen Unterschied zu machen oder so
- zugegeben, in der test-Programm, wenn ich mit der _USE_XOPEN es nicht beschweren, aber aus irgendeinem Grund im Zusammenhang mit dem eigentlichen Programm an dem ich arbeite, ohne _USE_XOPEN bekomme ich die compiler-Warnung "implicit declaration of function 'strptime'" auf eine wörtlich identische Aufruf zu jenen, die in dem oben genannten Programm. Warum würde das sein?
- Ich bin mir nicht sicher, was Sie suchen. Aber Sie sollten sich bewusst sein, dass das Zeitzonen-Kürzel ist gut für eine einzige Sache: Werfen Sie es Weg. Wussten Sie, dass es verschiedene Zeitzonen in der Welt, genannt "CST", alle mit unterschiedlichen UTC-offsets?
- Stellen Sie sicher, Sie haben entweder nicht definiert ein feature-test-Makros (_*_SOURCE), oder dass Sie zumindest
_XOPEN_SOURCE
auf einen Wert von mindestens 600 (vorzugsweise 700) an der Spitze der Quelle, bevor alle#include
Richtlinien. - Kann man wohl beheben, der die Warnung über
getdate()
undgetdate_r()
mit#define _GNU_SOURCE
parallel, aber Verschieden von,_XOPEN_SOURCE
und_POSIX_SOURCE
und_POSIX_C_SOURCE
. Die beiden letzteren sind vorhanden; Sie sind besser dran, einfach die Einstellung_XOPEN_SOURCE
wie bereits empfohlen (Einstellung_XOPEN_SOURCE
effektiv setzen der POSIX-source-Makros korrekt).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf MacOS X (10.7.1), einer der "bugs" aufgeführt, in der
strptime(3)
Handbuch Seite:Vor einiger Zeit schrieb ich ein paar Befehle - timestamp (Mai 1989 für revision 1.1) und strptime (Juli 2007 für die revision 1.1). Diese sind relativ Dünn, erstreckt sich über die
strftime()
undstrptime()
Funktionen.Läuft auf MacOS X, ich:
Ich bin in den USA/Pacific (oder America/Los_Angeles oder Pacific Daylight Time; UTC-07:00 Uhr), so, was diese Befehle zeigen ist, dass (wie im Handbuch Seite sagt),
strptime()
erkennt PDT und GMT und gibt die passenden Antworten für jeden. Die-u
optiontimestamp
gibt 'print UTC (aka GMT) - Zeit" eher als lokale Zeit. Und 9 pm in UTC ist in der Tat 2 Uhr PDT.Kontaktieren Sie mich, wenn Sie möchten, dass die Quelle - siehe mein Profil.