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() und getdate_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).

InformationsquelleAutor VMills | 2011-09-06
Schreibe einen Kommentar