InstallShield的ISString表中的时间戳格式是什么?

时间:2014-08-28 17:38:53

标签: string localization timestamp installshield

我最近试图确定这个问题的答案。我在这个主题上找到的唯一一篇文章就是Flexera网站上未经过回复的post

我想知道这个问题的答案,并将其纳入管理字符串翻译的工具中。我已经发现了答案(我的同事和我花了一半时间试图弄清楚它)但我想我会在Stack Overflow上发布问题/答案以防万一其他人搜索它。

1 个答案:

答案 0 :(得分:0)

答案是时间戳是一个32位整数,不同的位代表日期的不同部分。

以下是它如何分解

Bits 1-5  : The Day of the Month [1-31] (end range could be 28-31 depending on month)
Bits 6-9  : The Month [1-12]
Bits 10-16: The Year after 1980 (only goes to year 2107) [0-127]
Bits 17-21: (?) Seconds rounded to even (only 5 bits so can only contain 31 values) [0-30]
Bits 22-27: Minutes [0-59]
Bits 28-32: Hours from 12 AM [0-23] 

如果32位整数是无效日期,则评估为默认日期Dec/30/1899 12:00 AM

以下是一个例子:

  -------BINARY-32-bit-Integer-----          |   Decimal  |   Date String  
DOM   Month   Year  Seconds*2   Min   Hour   |            |               
00111 0111  0010000   00001    010000 00000  |  999295488 | Jul/07/1996 12:16 AM
 7      7     16      1         16     0

这是为了在DateTime和ISString时间戳的字符串表示形式之间转换而编写的一些C#代码(小免责声明:此代码当前不处理无效的时间戳输入):

    private static int bitsPerDOM = 5;
    private static int bitsPerMonth = 4;
    private static int bitsPerYear = 7;
    private static int bitsPerEvenSecond = 5;
    private static int bitsPerMinute = 6;
    private static int bitsPerHour = 5;

    private static int startYear = 1980;

    public static string getISTimestamp(DateTime date)
    {
        int[] shiftValues = { bitsPerDOM, bitsPerMonth, bitsPerYear, bitsPerEvenSecond, bitsPerMinute, bitsPerHour };
        int[] dateValues = { date.Day, date.Month, date.Year -startYear, date.Second/2, date.Minute, date.Hour };
        int shift = 32;
        int dateInt = 0;
        for (int i = 0; i < dateValues.Length; i++)
        {
            shift -= shiftValues[i];
            dateInt |= (dateValues[i] << shift);
        }

        return dateInt.ToString();
    }

    public static DateTime getTimeFromISTimestampStr(string ISTimestampStr)
    {
        int timestampInt = Int32.Parse(ISTimestampStr);
        int dom = getBits(timestampInt, 0, 4);
        int month = getBits(timestampInt, 5, 8);
        int year = startYear + getBits(timestampInt, 9, 15);
        int seconds = getBits(timestampInt, 16, 20) * 2;
        int minutes = getBits(timestampInt, 21, 26);
        int hours = getBits(timestampInt, 27, 31);            
        return new DateTime(year, month, dom, hours, minutes, seconds);
    }

    private static int getBits(int n, int start, int end)
    {
        //Clear left bits by shifting
        n <<= start;            
        n >>= 31 + start - end; //Shift to the right
        return n;
    }