从日期/时间创建修订号

时间:2009-10-06 19:29:30

标签: c# revision

是否有替代修订号(递增的int)?我想从日期+时间创建修订标记(或标识符,如果您愿意)(稍后将标记转换回日期时间对象)。

优选地,修订版尽可能小。 CouchDB使用这样的格式进行修改:765B7D1C - 但我不确定他们是如何制作的,如果它甚至是时间戳。

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

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

这将返回自2000-01-01以来的天数(截至今天,这将是3566)。

如果将程序集版本(在AssemblyInfo.cs中)指定为“1.0。*”,则类似于.NET中使用的内容。当然,您也可以使用另一个开始日期,例如项目的开始日期。

答案 1 :(得分: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年8月左右爆炸。或者如果你使用天数,你可以存储88年的apx,所以你可以安全地使用Martin的建议。

答案 2 :(得分:0)

查看VSVersion Manager,它是一组用于根据日期在AssemblyInfo中设置版本号的宏。

每次构建都会触发宏。

您可以设置规则,将修订字段设置为任何日期元素(月,日,年不同格式),将它们递增1或保持不变。

该网站包含安装宏的详细说明。

答案 3 :(得分:0)

挑战在于:您是否可以将日期+编译时间 编入程序?最好采用您选择的格式,但任何格式就足够了,因为您可以按照自己喜欢的方式重新格式化为“标记”。 (如果你无法在编译时重新格式化它,你可以在运行时重新格式化它。)

答案是:没有直接方式。 C#没有__DATE____TIME__。编译时的日期+编译时间完全不可用。如果某个程序想要知道其编译的日期+时间,它只能尝试在运行时选择它们,通过检查自己。 C#在已编译的程序中及其周围创建数据结构,但在编译时没有任何字段可用,并且没有一个保证具有日期+编译时间。

解决方案1(我最喜欢的):VS不会无条件地将编译日期+时间写入适当命名的字段,以便为您提供该信息。但它有条件地将编译日期+时间的衍生物写入4个版本字段中的2个,作为在可执行文件上放置自动递增版本号的一种方法,如果你告诉它的话。 “AssemblyVersion”是4个字段的结构(“主要版本”,“次要版本”,“构建号”和“修订版”),它们通常只是由程序员(或版本控制软件)键入的4个UInt16号码。但是,如果,您将AssemblyVersion的字段设置为ab*和[空字符串],,并且没有人更改最后一个2 ,然后编译器将最后两个重写为cd,其中c == days和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的使用在该视图中是隐藏的。

解决方案2 :(我不喜欢它,因为元数据很容易更改,并且可以阻止访问。)正在运行的程序通过文件系统找到自己(.exe文件)并读取自己的上次修改日期。但最后修改日期是存储在文件系统中的元数据,而不是程序文件。通过时区传输或通过FAT,CDFS或FTP进行DST更改,可以轻松更改或丢失上次修改日期;懒惰的FTP服务器,不接受传入的日期+时间元数据; 围绕旧时间戳的疯狂FTP服务器;以及根据请求更改元数据的文件实用程序有时文件权限会受到阻碍。所需的程序因操作系统而异。 (即使我尝试过这种方法,我也不会粘贴代码)

解决方案3 :(我发现它比解决方案2更好,因为数据无法更改,但比解决方案2更糟糕,因为可执行文件打开并将自身读取为作为二进制数据。)“Dustin Aleksiuk最近发布了一个聪明的博客条目,描述如何从可移植可执行文件头“ - https://blog.codinghorror.com/determining-build-date-the-hard-way/(带代码)的IMAGE_FILE_HEADER部分检索嵌入式链接器时间戳。它引用的博客条目(自2005年3月3日起)已经消失(与整个博客一起),但它存档于http://web.archive.org/web/20060615040705/http://blog.signaleleven.com/index.php?itemid=10

答案 4 :(得分:0)

如果您要询问格式化日期,答案会根据您想要的数据类型,精度(分辨率),您想要覆盖的时间范围,人类可读或机器可读的范围而有所不同以及如何解决时区问题。

想象一下日期和时间是2016-11-08 14:08:12。这已经是一个19个字符的字符串编码(如果是字符串,则为19个字节,而不是wstring)。

字符串:我喜欢yyyyMMdd-HHmmss:20161108-140812。 15个字符。我认为没有破折号和冒号就是更多人类可读。

BCD:Int64仅在8个字节中存储16个十进制数字,保留了人类的可读性(如果视为十六进制)。选择:
0x0020161108140812(0-799,999;第1s号决议)
0x0201611081408120(0-79,999年;决议0.1s)
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(0-9999或15,999年)
0020161108(0-429,496)

Int32可以将日期存储为BCD或十进制 0x20161108(0-7999年)
0020161108(0-214,748年)

几乎无穷无尽的可能性(如果你不看标准)。

这些只是一些人类可读的变体。