请教:
63 8A 8A 7D-->10进制--->/86400 +"1970-01-01" 是如何得到2008-12-26 hh:mm:ss的?
我怎么算都是2036-9-29 hh:mm:ss,并且在FlesHEX里看也是2036 sep 29 hh=mm:ss.
晕!头大!

解决方案 »

  1.   

    建议将2008-12-26 hh:mm:ss反向运算看一看
      

  2.   

    为了方便大家分析 我把部分数据贴上来
    63 8A 8A 7D  80 34 00 00  BC 34 00 00  44 34 00 00  BC 34 00 00  EE 74 05 00  8E 67 00 00 
    00 00 00 00  00 00 00 00  00 00 00 00 
    68 8A 8A 7D  B2 34 00 00  BC 34 00 00  58 34 00 00  58 34 00 00  5E F8 03 00  63 4B 00 00     00 00 00 00  00 00 00 00  00 00 00 00  
    6D 8A 8A 7D  3A 34 00 00  58 34 00 00  12 34 00 00     58 34 00 00  25 6F 01 00  41 1B 00 00  00 00 00 00  00 00 00 00  00 00 00 00
    ------------------------------------
    除每条记录第1字段外,其他字段用binary都可以直接读出了. 第一字段读出后是一个长整形数(x), 转换后应的时间不等于其真正的时间,或许这个字段是需要某种运算的.
    请大家帮我分析一下.谢谢
      

  3.   

    刚刚找到1个用vc写的
    -----------------------
    #include <conio.h>
    #include <stdio.h>
    int main()
    {
        FILE * fp = fopen( "d:\\dzh\\DATA\\SHase\\Min\\600000.nmn", "rb" );
        if( ! fp ) return 0;
        char pcBuf[ 40 ] = "" ;
        for( unsigned i=0; i<48; i++ )
        {
            fread( pcBuf, sizeof( pcBuf ), 1, fp );
            unsigned uTime = *( unsigned * ) pcBuf;
            unsigned uYear = ( uTime>>20 );//右移20位
            unsigned uMonth = ( ( uTime<<12)>>28);//先左移12位再右移28位
            unsigned uDate = ( ( uTime<<16)>>27);
            unsigned uHour = ( ( uTime<<21)>>27);
            unsigned uMinute = ( ( uTime<<26)>>26);
            double dOpen = double( *( float *)(pcBuf + 4) ) / 1000.0;
            double dHigh = double( *(float * )(pcBuf + 8) )/ 1000.0;
            double dLow = double(*(float*)(pcBuf+12))/1000.0;
            double dClose = double(*(float*)(pcBuf+16) )/1000.0;
            double dAmount = double(*(float*)(pcBuf+20));
            double dVolume = double(*(float*)(pcBuf+24));        printf( "%u-%02u-%02u %02u:%02u    %9.2f,%9.2f,%9.2f%9.2f%11.2f%11.2f\n",
                uYear, uMonth, uDate, uHour, uMinute, dOpen, dHigh, dLow, dClose, dAmount, dVolume );
        }
        fclose( fp );
        return 0;
    }
    ----------------
    但我不懂vc 所以请高手帮忙转成vb
      

  4.   

    各位老师 出手帮帮我吧
    我用以下代码已经算出了"年"
    但在计算"月"时"溢出"了 不知道该怎么办了Const s As Long = 2106231395y = s \ 2 ^ 20'正确
    m = (s * 2 ^ 12) \ 2 ^ 28'溢出
    d = s * 2 ^ 16 \ 2 ^ 27
    h = (s * 2 ^ 21) \ 2 ^ 27
    m = (s1 * 2 ^ 26) \ 2 ^ 26
      

  5.   

    Function DWord2Date(ByVal DWord As Long) As Date
        Dim iYear As Integer, iMonth As Integer, iDay As Integer
        Dim iHour As Integer, iMinute As Integer
        
        iYear = DWord \ &H100000
        iMonth = (DWord \ &H10000) And &HF&
        iDay = (DWord \ &H800) And &H1F&
        iHour = (DWord \ &H40) And &H1F&
        iMinute = DWord And &H3F&
        
        DWord2Date = DateSerial(iYear, iMonth, iDay) _
                   + TimeSerial(iHour, iMinute, 0)
    End Function
    结果是 2008-10-17 09:35,C 代码与你举的例子不符。
      

  6.   

    Tiger_Zhao老师:
    太谢谢您了!
    我和那段vc代码处理的是同一个问题
    我想他可能是写错
    您的代码解决了我的大问题
      

  7.   

    Tiger_Zhao老师: 
    麻烦您给我讲讲运算过程
    比如:iYear = DWord \ &H100000 是右移例几位?
         iDay = (DWord \ &H800) And &H1F&又是什么意思?
      

  8.   

    &H100000 = 2^20,不仅在运算中要尽量简化,而且 2^20 的值是 Double 类型,更多出来类型转化的工作。unsigned uDate = ( ( uTime < <16)>>27); 
    按照 C 的规则,其实是将最高 16 位清除,最终右移 27-16=11 位,所以有效位为 32-16-11=5。
    2^11 = &H800,5 个最低位的掩码就是 &H1F&,用 And 操作就可以其它的位过滤掉。