2009-10-06 190 views
0

是否有修訂號的替代方法(遞增int)?我想從日期+時間創建一個修訂標記(或標識符,如果您喜歡)(以及稍後將標記轉換回日期時間對象)。從日期/時間創建修訂號

優選地,修訂儘可能小。 CouchDB使用這樣的格式進行修改:765B7D1C - 但我不確定他們是如何做到的,以及它是否是時間戳記。

有什麼建議嗎?

回答

1

你可以使用這樣的事情:

DateTime.Now.Subtract(new DateTime(2000, 1, 1)).Days 

這將返回自2000-01-01天數(截止到今天,這將是3566)。

如果您將程序集版本(在AssemblyInfo.cs中)指定爲「1.0。*」,這與.NET中使用的類似。當然,你也可以使用另一個開始日期,例如你的項目開始。

+0

好吧,讓我們說有一天有兩個更新...然後它不會工作。 – 2009-10-06 19:38:19

+0

這不就是說,revId <-->版本映射不一定是雙射的嗎?從技術上講,這只是一個單調遞增的整數(OP表示他們想要替代的東西),這恰好與自任意日期以來的時間相對應。 – 2009-10-06 19:41:04

+0

這個想法雖然不錯。 ((long)DateTime.Now.Subtract(new DateTime(2000,1,1))。TotalMilliseconds).ToString(「X」)會給出類似於47C0FAF85B的結果 - 更好,但仍需要改進 – 2009-10-06 19:41:05

0

我最近經歷了同樣的思考過程。我找不到一個好方法將它放入您允許的signed int中。相反,我選擇了Maj。{Year-2000}。{MMdd}。{svn revision}。你仍然可以嘗試和塞滿日期...這是問題:

1年= 365天= 8760小時= 525600分鐘。正如你所看到的,最高可達32k,你今年可以做的最好的時間是幾小時。可以記錄下一個3.5年價值,所以你可以這樣做:

int revision = (int) (DateTime.Now - new DateTime(2009, 1, 1)).TotalHours; 

...然後這將炸燬月左右,2012年或者,如果您使用的日子裏,你可以存儲APX88年,所以你可以安全地和馬丁的建議一起去。

0

看看VSVersion Manager這是一組宏,用於根據日期在AssemblyInfo中設置版本號。

該宏在每個構建中被觸發。

您可以爲任何日期元素(月份,日期,年份,不同格式)設置修訂字段的規則,讓它們增加1或保持原樣。

該網站包含有關安裝宏的詳細說明。

0

挑戰是:你能得到日期+時間編譯編譯成你的程序?最好以你選擇的格式,但任何格式就足夠了,因爲你可以以任何你喜歡的方式重新格式化爲「標籤」。 (如果在編譯時無法重新格式化,可以在運行時將其重新格式化爲超出識別範圍。)

答案是:沒有直接的方法。 C#沒有什麼像__DATE____TIME__。編譯時的日期+編譯時間爲完全不可用。如果一個程序想知道編譯的日期+時間,只能通過嘗試在運行時檢測它們,通過檢查自己。 C#在已編譯的程序中或周圍創建數據結構,但編譯時沒有任何字段可用,並且沒有一個字段保證具有編譯日期和時間。

解決方案1(我的最愛至今):VS不會無條件地寫編譯日期+時間到適當命名字段,爲給你的信息的目的。但它有條件地將編譯日期+時間的衍生物寫入4個版本字段中的2個,如果您告訴它,可以將自動遞增版本號放在可執行文件上,這是一種非常糟糕的方式。 「AssemblyVersion」是由4個字段(「主要版本」,「次要版本」,「內部版本號」和「版本」)組成的結構,通常由程序員(或版本控制軟件)輸入4個UInt16號碼。但是,如果您設置的AssemblyVersion的領域ab*和[空字符串],沒有人改變了過去的2,則編譯器將覆蓋近兩年來cd,其中c ==天和d * 2 ==自2000年1月1日00:00(當地時間,但不考慮夏令時)(使文件的文件屬性下可見的非人爲可解碼時間戳)它解析AssemblyInfo.cs的那一刻。

private string DateCompiled() 
{ 
    System.Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; 
    // v.Build == days and v.Revision*2 == seconds since Jan. 1, 2000 at 00:00 (midnight, 12:00am). (Local time, but disregards daylight saving time.) 
    return new DateTime(2000, 1, 1).AddDays(v.Build).AddSeconds(v.Revision * 2).ToString("yyyyMMdd-HHmm (local no DST)"); 

    // "Assembly version" has four UInt16 fields: "Major Version", "Minor Version", "Build Number", and "Revision". 
    // When Build is "*" and Revision is empty, the compiler overrides them with the encoded date and time. 
    // AssemblyVersion can be specified in the solution Properties window, Application tab, "Assembly Information..." button and dialog box: Assembly version. 
    // AssemblyVersion can also be specified in "AssemblyInfo.cs". Example: 
    // [assembly: AssemblyVersion("2016.11.*")] 
    // AssemblyFileVersion is optional, defaulting to AssemblyVersion if not specified. (Build is NOT allowed to be "*".) 
    // Properties of the file (in Windows Explorer) displays AssemblyFileVersion. 
    // AssemblyVersion can be specified in the solution Properties window, Application tab, "Assembly Information..." button and dialog box: File version. 
    // AssemblyVersion can also be specified in "AssemblyInfo.cs". Example: 
    // [assembly: AssemblyFileVersion("1.2.3.4")] 
} 

如果你想文件:這些都是很容易地通過訪問屬性(在Internet Explorer)來顯示您所選擇的任意A.B.C.D版本,你可以做到這一點。文件:屬性顯示AssemblyFileVersion,如果未指定,則默認爲AssemblyVersion。您只能在「AssemblyInfo.cs」中指定AssemblyFileVersion(只需爲其添加新行,使用與AssemblyVersion相同的語法,但不允許使用「*」)。編輯日期+編譯時間的[AssemblyVersion]的[half of]的使用在該視圖中是隱藏的。

解決方案2:(因爲元數據容易發生變化和可能無法訪問,我不喜歡。)正在運行的程序發現自身(.exe文件)通過文件系統並讀取自己的最後修改日期。但最後修改的日期是存儲在文件系統中的元數據,而不是程序文件。通過跨時區傳輸或通過FAT,CDFS或FTP進行DST更改,可以輕鬆更改最後修改日期;不接受傳入日期+時間元數據的懶惰FTP服務器;瘋狂的FTP服務器回合舊的時間戳;和根據請求更改元數據的文件實用程序。有時文件權限會妨礙你的發展。所需的程序因操作系統而異。 (即使我嘗試過這種方法,我也不會粘貼代碼)

解決方案3 :(我發現它比解決方案2更好,因爲數據不能更改,但比解決方案2更糟,因爲可執行文件打開並讀取。本身作爲二進制數據)「達斯汀Aleksiuk最近發佈了一個聰明的博客條目描述如何從移植可執行頭的IMAGE_FILE_HEADER部分嵌入的鏈接時間戳」 - https://blog.codinghorror.com/determining-build-date-the-hard-way/(含代碼)。它引用的博客條目(從2005年3月3日起)已不存在(與整個博客一起),但存檔爲http://web.archive.org/web/20060615040705/http://blog.signaleleven.com/index.php?itemid=10

0

如果您詢問格式化日期,答案會根據數據類型,你想要的精度(分辨率),你想要覆蓋的時間跨度,它應該是人類可讀的還是機器可讀的,以及如何處理時區。

想象的日期和時間是2016-11-08 14:08:12。這已經是一個19個字符的字符串編碼(如果字符串是19個字節,而不是wstring)。

字符串:我喜歡YYYYMMDD-HHMMSS:20161108-140812。 15個字符。我認爲這是更多沒有破折號和冒號的人類可讀。

BCD:Int64的存儲16個十進制數字中只有8個字節,維護人的可讀性(如果視爲十六進制)。選擇:
0x0020161108140812(年0-799,999;分辨率1S)
0x0201611081408120(年0-79,999;分辨率0.1秒)
0x2016110814081200(年0-7999;分辨率爲0.01s)
(第一位數字被限制爲0。 .7因爲Int64是有符號的;它的最大值是0x7fffffffffffffff。)

十進制:Int64只在8個字節中存儲18.96個十進制數字。 0000020161108140812(年0-922,337,203;分辨率1S)
0020161108140812000(年0-922,337;分辨率0.001S)(最大值爲9,223,372,036,854,775,807)

UInt32的可存儲的時間(8位)爲BCD或十進制。
0x20161108(年〜9999或15999)
0020161108(年0-429,496)

的Int32可以存儲日期BCD或小數。
0x20161108(年0-7999)
0020161108(年0-214,748)

有近無限的可能性(如果你不看爲標準)。

這些只是一些更人性化的變化。

相關問題