【问题标题】:(c/c++) dd/mm/yyyy hh:ii:ss to unix timestamp(c/c++) dd/mm/yyyy hh:ii:ss 到 unix 时间戳
【发布时间】:2015-10-31 10:43:14
【问题描述】:

给定一个日期字符串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) 以来经过的秒数,不包括闰秒。

【问题讨论】:

  • 什么意思,你没有找到确切的公式?您可以解析字符串并将数据放入struct tmmktime 函数将为您提供time_t,这是一个有效的 Unix 时间戳。您甚至可以将解析推迟到strptime
  • @DieterLücking strftime() 对我没有任何好处,它会返回一个基于给定 unix 时间戳的字符串,我正在寻找相反的结果,输出是一个长整数,因为例如1446288870
  • @user5470921 你应该注意没有像 C/C++ 这样的语言。我在您的问题中看不到任何与 C++ 相关的内容。
  • @πάνταῥεῖ 所需的代码是 c 或 c++,怎么不相关?
  • @MOehm 通过公式我的意思是 mktime() 里面的内容(直到现在我才知道它存在于 c++ 中),我会试一试。

标签: c time arduino unix-timestamp


【解决方案1】:

如 cmets 中所述,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

【讨论】:

  • 太棒了!我用它在 arduino 上使用。
  • @user5470921 很高兴我能帮上忙。如果您觉得有用,请随时 accept this answer
【解决方案2】:

您可以创建一个 tm 结构(来自 /)并将这些参数传递给它,然后您可以简单地调用 mktime() 函数或 timegm() 函数,这取决于您想要将输入作为本地时间或 GMT 时间。

您应该仔细记住的一件事是,存储在 tm 结构中的实际年份是 (year-1990),月份应该是 (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。

【讨论】:

    【解决方案3】:

    在arduino上使用时间库github.com/PaulStoffregen/Time

    #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);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2023-03-26
      • 2017-07-09
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多