2014-04-29 66 views
1

有没有任何方法可以将C中的milliseconds转换为date将C中的毫秒数转换为C

我想要做的是在C中写一个小应用程序,它可以返回给定开始月份和isCurentYear bool的财政年度等(季度,星期),其中输入可能是毫秒或日期!

首先,有什么方法可以在C中实现?

如果是这样,在找出转换millisecondsdate 的一种方式的过程中我发现,使用的time_t需要通过创建指向它的结构我们的系统和当前米利斯,它可以使我们提取年,月,日,秒等!

参见下面的代码:

#include <sys/time.h> 
#include<stdio.h> 
#include<time.h> 

void main() 
{ 
    time_t t = time(000); 
    //time_t t = time(0); 
    struct tm tm = *localtime(&t); 

    printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, 
             tm.tm_hour, tm.tm_min, tm.tm_sec); 
} 

并且也能time_t被用来存储millisecond值,以便它可以使用tm结构转换成日期?

+0

毫秒以来什么时候?将经过时间的度量转换为时间戳就像将距离转换为位置一样。没有起点和方向,这个问题就没有道理。 – Art

+0

起点是unix时代,参考时间 – user3584114

回答

1

功能time_t time(time_t* timer)返回自00:00小时,1970年1月1日UTC经过的秒数。另外,如果输入参数为timer != NULL,那么该函数也会将此参数设置为相同的值(因此您可能没有理由使用NULL以外的其他值调用它)。


功能struct tm* localtime(const time_t* timer)需要的自00:00小时,1970年1月1日UTC经过的秒数,并返回表示等效时间&日期的结构。如果你正在开发一个多线程应用程序,那么请注意,这个函数是而不是线程安全。


至于你的问题 - 有没有办法为毫秒转换时间&日期 - 是的,但:

  • 考虑到毫秒将被视为00:00时, 1970年1月1日UTC。
  • 由于time_t类型为32位长,因此您将无法将4G * 1000毫秒或更长时间转换为。

这里是毫秒转换时间&日期函数:

struct tm* GetTimeAndDate(unsigned long long milliseconds) 
{ 
    time_t seconds = (time_t)(milliseconds/1000); 
    if ((unsigned long long)seconds*1000 == milliseconds) 
     return localtime(&seconds); 
    return NULL; // milliseconds >= 4G*1000 
} 
+0

是的!谢谢! :)确实有用! – user3584114

+0

@ user3584114:不客气:) –

+0

Hi @chux。我意识到time_t没有被标准定义为一个32位变量,但它在大多数情况下是** 32位变量,所以我想给OP提供一个有效的答案,而不是去进入标准的“微小”细节。关于“重复翻转”的注释是正确的,我想,所以我会将“1000”移到等式的另一边。谢谢。 –

0

也许,您正在寻找strftime函数。

char text[100]; 
time_t now = time(NULL); 
struct tm *t = localtime(&now); 


strftime(text, sizeof(text)-1, "%d %m %Y %H:%M", t); 
printf("Current Date: %s", text); 
+0

实际上我需要一个通用的转换机制,以便如何将给定的毫秒值转换为C中的日期格式,而不是当前时间。 – user3584114

+0

那么,'time_t'结构通常持有olny整数值(例如,从'time函数返回时),它是自1970年1月1日以来的秒数。因此,您无法合法使用它来存储毫秒。但是,您可以通过简单地将其除以1000来将毫秒转换为秒,并以准确性为代价。然后,您可以使用专用函数。其次是'time_t'具有您选择的价值。如果你对它赋值,返回表单'时间'函数,那么你就有当前时间。如果你分析不同的价值,例如'time_t a = 0',那么你有1970年1月1日,代表上面解释。 – user3581454

+0

然后是'localtime',函数。它只是将参数值转换为更容易使用的结构,因为它表示的是日常日历中的日期,具有几年,几天等等。当然,它假设参数是自1970年1月1日UTC以来的秒数,并将转换它到目前为止在您的本地时区,基于您的系统设置。当然,如果你想以这种方式表示日期,你将不得不选择时区。 – user3581454

0

对于我们这些谁是对的答案,适用于嵌入式C应用程序在网上搜索,认为PIC 32这里的编程是数学计算:

Date in Epoch_seconds =((epoch_seconds/1000)/ 86400)+ 25569

在一个5位数的答案是10位长的格式DD/MM/YYYY 所得的(注:斜杠在这里的结果编码,从而转换为人类可读的日期时请考虑它)

凡1天= 86400毫秒

和日期1970/1/1 = 25569

例如:=((1000分之1510827144853)/ 86400)+ 25569 = 43055

放43055在Excel和格式细胞迄今dd/MM/yyyy,它给你16/11/2017