簡體   English   中英

如何僅從 DateTime.Now.Date 值構造 2 個字節或短字節? 年年月日

[英]How to construct a 2 bytes or short from DateTime.Now.Date only value? YYYYmmDD

我看到有些人只將日期存儲到 2 個字節(ushort)!,而不是 4 個字節(int)

假設格式yyyyMMdd : 20220521 ,適合 1 個短字節和 1 個字節。 或僅 1 個整數。 但是接下來的代碼我只是從反編譯的源代碼中復制了它。 (不明白他是如何操縱比特的……)

在我看來。 年份的最后一位數字可以是 1 字節(2022 將存儲為 22 字節)+ 月、日的縮寫為 1.... 但我沒能像下面的示例那樣將其設為 2 字節。

我什至不明白他們是如何實現的......我不明白下一個代碼是如何工作的。 想知道他是怎么想的……

   private byte[] PackDate16(DateTime date)
        {
            if (date.Year < 2000 || date.Year > 2127)
                throw new Exception("Invalid year for a 16-bit date. Allowed values are 2010-2127");
            ushort num = (ushort)(date.Year - 2000 << 9 | date.Month << 5 | date.Day);
            return new byte[2]
            {
        (byte) ((uint) num & (uint) byte.MaxValue),
        (byte) ((uint) num >> 8)
            };
        }

經過一番搜索......我找到了https://bytes.com/topic/net/answers/661377-c-program-convert-2-byte-time-2-byte-date-datetime

是否有任何位庫可以輕松做到這一點?

如果你可以加減天數,那你為什么不用位來操作呢?

private static short CompressMe(DateTime value, DateTime minDate) =>
  (short)((value - minDate).Days + short.MinValue);

private static DateTime DeCompressMe(short value, DateTime minDate) =>
  minDate.AddDays(value - short.MinValue); 

例如:

DateTime minDate = new DateTime(2000, 1, 1);

// -24592
var result = CompressMe(new DateTime(2022, 5, 21), minDate);
// 6 June 2179
DateTime maxDate = DeCompressMe(short.MaxValue, minDate);

到目前為止,您可以將日期表示為short ,如果它們在

1 Jan 2000 .. 6 Jun 2179

時期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM