在DOS中,用4个字节表示年月日,时分秒,我怎么把这四个字节换算出来呢?

zhang_dq 2003-12-04 11:08:51
例如:2F 83 8B E1 表示2003年12月3号 17点16分01秒
我改如何换算呢?
...全文
1123 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_dq 2003-12-04
  • 打赏
  • 举报
回复
我也发现差点,可能是单片机的毛病!谢谢大家了!
leon_z 2003-12-04
  • 打赏
  • 举报
回复
unsigned long ntime = 0x2F8389E1;
unsigned long nDay,nYear,nMon,nH,nM,nS;
nYear = ntime >> 25;
nMon = (ntime >> 21) & 0xF;
nDay = (ntime >> 16) & 0x1f;
nH = (ntime >> 11) & 0x1f;
nM = (ntime >> 5) & 0x3f;
nS = ntime & 0x1f;
CString strTime;
strTime.Format("%04d-%02d-%02d %02d:%02d:%02d",nYear + 1980,nMon,nDay,nH,nM,nS);
AfxMessageBox(strTime);

好象和你的时间,差一分钟
zhang_dq 2003-12-04
  • 打赏
  • 举报
回复
不是,我是从单片机上获得的时间,它用两个字节表示的,我只是想得到具体的时间而已!
zhang_dq 2003-12-04
  • 打赏
  • 举报
回复
不好意思,是我给的数据错了,我获得了两个数据,发帖子的时候写混了!不好意思!
leon_z 2003-12-04
  • 打赏
  • 举报
回复
那又何必呢,有现在的高效函数调呀

你是不是要在纯DOS下写这个程序呀?
zhang_dq 2003-12-04
  • 打赏
  • 举报
回复
TO 薄荷:
是对的,具体算法是:
前两个字节表示年月日,日占五位,月占四位,年占7位,年是从1980开始的,就是1980加上前7个位的值;
后两个字节表示时分秒:秒占5个位,分占6位,时占5位,其中秒最小单位是2,既误差才2秒!
你算算,我给的2F 83 89 E1 就是那个时间!
topwork 2003-12-04
  • 打赏
  • 举报
回复

int main(int argc, char* argv[])
{

// 2F 83 8B E1 表示2003年12月3号 17点16分01秒

FILETIME ft;
SYSTEMTIME tm;
DosDateTimeToFileTime(0x2f83 , 0x8be1 , &ft);
FileTimeToSystemTime(&ft , &tm);
}

这个倒是可以转换一下,但是有问题,转换出来的时间是2003-12-3 17-21-02
是不是搂主的数字有误;
bluebohe(薄荷)的函数转换出来是多少?
topwork 2003-12-04
  • 打赏
  • 举报
回复
先确认一点,就是楼主的值是对应的吧。
bluebohe 2003-12-04
  • 打赏
  • 举报
回复
0x3fcda9d1是time1(2003,12,3,17,16,1);的值,所以我真的不知道你是怎么转换的
bluebohe 2003-12-04
  • 打赏
  • 举报
回复
我刚才看了一下2F 83 8B E1 这些数并不能组成一个正确的time_t值,我再看一看吧
bluebohe 2003-12-04
  • 打赏
  • 举报
回复
主要是使用localtime函数
#include <time.h>
#include <stdio.h>

void main( void )
{
struct tm when;
time_t now, result;
int days;

time( &now );
when = *localtime( &now );
printf( "Current time is %s\n", asctime( &when ) );
printf( "How many days to look ahead: " );
scanf( "%d", &days );

when.tm_mday = when.tm_mday + days;
if( (result = mktime( &when )) != (time_t)-1 )
printf( "In %d days the time will be %s\n",
days, asctime( &when ) );
else
perror( "mktime failed" );
}
bluebohe 2003-12-04
  • 打赏
  • 举报
回复
把这四个字节赋值给一个long值或者time_t值,应该就是这样
leon_z 2003-12-04
  • 打赏
  • 举报
回复
可以用一个 unsigned long 来表示时间

可以从1900 起,如果你是在控制台下用VC6编程的话 ,可以使用 STL 库中的 time_t、tm struct

相关函数: mktime,time,ctime,gmtime,asctime 等
time_t 就是一个 四字节的长整

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧