cでdatetimeをunixタイムスタンプに変換する方法は?
質問
シナリオは次のとおりです。「quot」YYYY-MM-DD HH:MM:SS"の形式で日時を取得します。 libexifで。節約コストを最小限に抑えるために、datetimeをUNIXタイムスタンプなど、64ビットまたは32ビットのみのコストに変換したいと思います。 cに明示的な方法はありますか?
他のヒント
日付/時刻の各部分を整数に変換して struct tm
に入力し、それを
これは、一緒にハッキングしたc / pseudoコードの有線ソリューションです。がんばって!
char * runner = NULL;
char *string_orig = "YYYY-MM-DD HH:MM:SS";
time_t time = 0;
struct tm tmp;
use strstr(string_orig, "-") and atoi foreach
tmp->tm_year ..
tmp->tm_mon ..
tmp->tm_mday ..
tmp->tm_hour ..
tmp->tm_min ..
tmp->tm_sec ..
with *runner as help
time = mktime(&tm)
sscanfはどうですか?
struct tm tmVar;
char *strVar = "YYYY-MM-DD HH:MM:SS";
time_t timeVar;
if(sscanf(strVar, "%d-%d-%d %d:%d:%d", &tm.tm_year, /* the other fields */)==6)
timeVar = mktime(&tmVar);
else
// bad format
strptimeが利用できない場合の準備ができたスニペットです:
#include <stddef.h>
#include <time.h>
#include <stdio.h>
time_t string_to_seconds(const char *timestamp_str)
{
struct tm tm;
time_t seconds;
int r;
if (timestamp_str == NULL) {
printf("null argument\n");
return (time_t)-1;
}
r = sscanf(timestamp_str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
if (r != 6) {
printf("expected %d numbers scanned in %s\n", r, timestamp_str);
return (time_t)-1;
}
tm.tm_year -= 1900;
tm.tm_mon -= 1;
tm.tm_isdst = 0;
seconds = mktime(&tm);
if (seconds == (time_t)-1) {
printf("reading time from %s failed\n", timestamp_str);
}
return seconds;
}
sscanfの文字列を必要に応じて調整します。タイムゾーンを無視し、常にGMT / UTCに変換するには、 seconds
( timezone
から timezone
(または _timezone
)を引きますglobalはtime.hで定義されています。DSTは、 tm
の tm_isdst
フィールドをゼロにすることですでに無視されます。
Linuxは getdate()
関数をサポートしています。これは strptime()
を直接呼び出すよりも実用的だと思います。これは、 getdate()
関数が自動的に many 形式をチェックするためです。関数が機能するか、すべての形式がテストされるまで、さまざまな形式で strptime()
を呼び出すのと同じです。
// setenv() should be called only once
setenv("DATEMSK", "/usr/share/myprog/datemsk.fmt", 0);
// convert a date
struct tm * t1(getdate("2018-03-31 14:35:46"));
if(t1 == nullptr) ...handle error...
time_t date1(timegm(t1));
// convert another date
struct tm * t2(getdate("03/31/2018 14:35:46"));
if(t2 == nullptr) ...handle error...
time_t date2(timegm(t2));
注: timegm()
は mktime()
と似ていますが、ロケールを無視してUTCを使用する点が異なります。ほとんどの場合、これが日付を変換する正しい方法です。
datemsk.fmtファイルには、上記の日付をサポートするために、少なくとも次の2つの形式が含まれます。
%Y-%b-%d %H:%M:%S
%b/%d/%Y %H:%M:%S
サポートされている形式の数に制限はありませんが、多すぎることは望ましくありません。フォーマットが多すぎる場合は、かなり遅くなります。また、フォーマットを動的に管理し、ループで strptime()
を呼び出すこともできます。
Linuxは、スレッドセーフな getdate_r()
関数も提供しています。
マニュアルページ: http://pubs.opengroup.org/onlinepubs/ 7908799 / xsh / getdate.html