0

是否有替代版本号(增量 int)?我想从日期+时间创建一个修订标签(或标识符,如果你喜欢)(然后将标签转换回日期时间对象)。

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

有什么建议么?

4

5 回答 5

1

你可以使用这样的东西:

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

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

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

于 2009-10-06T19:34:17.180 回答
0

我最近经历了同样的思考过程。我找不到将其放入您允许的签名 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 月左右爆发。或者,如果您使用天数,则可以存储 apx 88 年,因此您可以安全地接受 Martin 的建议。

于 2009-10-06T19:41:37.810 回答
0

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

宏在每次构建时触发。

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

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

于 2009-10-06T19:47:43.037 回答
0

挑战是:你能把编译的日期+时间 编译到你的程序中吗?最好采用您选择的格式,但任何格式都足够了,因为您可以以任何您喜欢的方式重新格式化为“标签”。(如果您无法在编译时重新格式化它,您可以在运行时重新格式化它以使其无法识别。)

答案是:没有直接的方法。C# 没有类似__DATE__or的东西__TIME__。编译的日期+时间在编译时完全不可用。如果一个程序想知道其编译的日期+时间,它只能在运行时通过检查自己来尝试获取它们。C# 在编译后的程序中和周围创建数据结构,但没有一个字段在编译时可用,并且没有一个保证有编译的日期+时间。

解决方案 1(到目前为止我最喜欢的):VS 不会无条件地将编译日期+时间写入适当命名的字段,以便为您提供该信息。但它确实有条件地将编译日期+时间的派生写入 4 个版本字段中的 2 个,作为在可执行文件上放置自动递增版本号的一种巧妙方式,如果你告诉它的话。“AssemblyVersion”是 4 个字段(“Major Version”、“Minor Version”、“Build Number”和“Revision”)的结构,通常只是程序员(或版本控制软件)输入的 4 个 UInt16 数字。但是,如果您将 AssemblyVersion 的字段设置为ab*和 [空字符串],并且没有人更改最后 2cd,其中 c == days 和 d*2 == seconds 自 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")]
}

如果您希望 File:Properties(在 Internet Explorer 中)显示您选择的任意 abcd 版本,您也可以这样做。File:Properties 显示 AssemblyFileVersion,如果未指定,则默认为 AssemblyVersion。您只能在“AssemblyInfo.cs”中指定 AssemblyFileVersion(只需为其添加一个新行,使用与 AssemblyVersion 相同的语法,但不允许使用“*”)。从该视图中隐藏了使用 [half of] AssemblyVersion 编码的编译日期+时间。

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

解决方案 3:(我发现它比解决方案 2 更好,因为数据无法更改,但比解决方案 2 更糟糕,因为可执行文件打开并将自身读取为二进制数据。)“Dustin 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

于 2016-11-07T22:53:53.880 回答
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 已签名;其最大值为0x7ffffffffffffff.)

十进制: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 年)

几乎有无限的可能性(如果你不看标准的话)。

这些只是一些更易于人类阅读的变体。

于 2016-11-08T19:59:12.833 回答