给定日期字符串dd/mm/yyyy hh:ii:ss
,我们希望通过函数将其转换为unix时间戳(10位)。
long foo(int yyyy, int mm = 0, int dd = 0, int hh = 0, int ii = 0, int ss = 0) { }
我无法找出能够提供准确结果的确切公式,与unixtimestamp.com匹配。
Unix时间是用于描述时间瞬间的系统,定义为自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数,不计算闰秒。
答案 0 :(得分:0)
您可以创建一个tm结构(来自< time.h> /< ctime>)并将这些参数传递给它,然后您可以简单地调用mktime()函数或timegm()函数,这取决于您希望将输入作为本地时间或GMT时间。
您应该仔细记住的一件事是存储在tm结构中的实际年份是(year-1990),而month应该是(month-1)。不要忘记设置tm的tm_isdst标志。您可以设置为-1,可以自动检测是否应用了夏令时。
例如,您想转换GMT 11/02/1990 00:16:50。
tm* t;
t->tm_sec = 50;
t->tm_min = 16;
t->tm_hour = 0;
t->tm_mday = 11;
t->tm_mon = 1; // 2-1, not 2!
t->tm_year = 90; // 1990-1900, not 1990!
t->tm_isdst = -1;
然后你可以调用timegm(t)来获得结果634695410。
答案 1 :(得分:0)
正如评论中所提到的,strptime
可以为您创建struct tm
进行解析。然后,您可以致电mktime
获取time_t
:
#include <stdio.h>
#include <stdlib.h>
#define _XOPEN_SOURCE
#include <time.h>
int main(void)
{
struct tm mytm;
time_t t;
strptime("31/10/2015 08:33:00","%d/%m/%Y %H:%M:%S",&mytm);
t = mktime(&mytm);
printf("t=%ld\n",t);
return 0;
}
结果:
t=1446294780
答案 2 :(得分:0)
#include <Time.h>
struct unix {
long get(int y, int m = 0, int d = 0, int h = 0, int i = 0, int s = 0) {
setTime(h, i, s, d, m, y);
adjustTime(-10800); // +3
return now();
}
} unix;
void setup() {
Serial.begin(19200);
Serial.setTimeout(0);
Serial.println("..");
//Serial.println(unix.get(2015));
//Serial.println(unix.get(2015, 10));
//Serial.println(unix.get(2015, 10, 31));
//Serial.println(unix.get(2015, 10, 31, 18));
//Serial.println(unix.get(2015, 10, 31, 18, 41));
//Serial.println(unix.get(2015, 10, 31, 18, 41, 0));
Serial.println("Enter the date (dd/mm/yyyy hh:ii:ss am/pm). Example: \"31/10/2015 7:27 pm\".");
}
void loop() {
while (Serial.available() > 0) {
int dd = Serial.readStringUntil('/').toInt();
int mm = Serial.readStringUntil('/').toInt();
int yyyy = Serial.readStringUntil(' ').toInt();
int hh = Serial.readStringUntil(':').toInt();
int ii = Serial.readStringUntil(':').toInt();
int ss = Serial.readStringUntil(' ').toInt();
String pm = Serial.readStringUntil('\n');
if (pm == 0) pm = "am";
Serial.print(dd); Serial.print("/");
Serial.print(mm); Serial.print("/");
Serial.print(yyyy); Serial.print(" ");
Serial.print(hh); Serial.print(":");
Serial.print(ii); Serial.print(":");
Serial.print(ss); Serial.print(" ");
Serial.print(pm); Serial.print(" = ");
if (pm == "pm") hh += 12;
Serial.println(unix.get(yyyy, mm, dd, hh, ii, ss));
Serial.println();
Serial.println("Enter the date (dd/mm/yyyy hh:ii:ss am/pm).");
}
delay(50);
}