2009-10-06 78 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)

有近无限的可能性(如果你不看为标准)。

这些只是一些更人性化的变化。