4

有谁知道声明与国际日期兼容的日期常量的方法?

我试过了:

' not international compatible
public const ADate as Date = #12/31/04#

' breaking change if you have an optional parameter that defaults to this value
' because it isnt constant.
public shared readonly ADate As New Date(12, 31, 04)
4

5 回答 5

6

如果查看语句生成的 IL

public const ADate as Date = #12/31/04#

你会看到这个:

.field public static initonly valuetype [mscorlib]System.DateTime ADate
.custom instance void [mscorlib]System.Runtime.CompilerServices.DateTimeConstantAttribute::.ctor(int64) = ( 01 00 00 C0 2F CE E2 BC C6 08 00 00 )

请注意,DateTimeConstantAttribute正在使用采用 int64 滴答计数的构造函数进行初始化。由于此滴答计数是在编译时确定的,因此在运行时初始化此值时,似乎不太可能有任何本地化发挥作用。我的猜测是错误与代码中的其他日期处理有关,而不是 const 初始化。

于 2008-09-12T17:56:53.523 回答
4

根据微软文档,

“您必须将日期文字括在数字符号 (# #) 中。您必须以 M/d/yyyy 格式指定日期值,例如 #5/31/1993#。此要求与您的区域设置和计算机的设置无关日期和时间格式设置。”

你是说这不正确,解析受当前语言环境影响?

编辑:您是否尝试使用 4 位数的年份?

于 2008-09-11T20:53:18.117 回答
1

在 VB 中将数据放入 Date 对象后,您不必担心全球化,除非您将其与某些内容进行比较或尝试将其导出。

这可以:

Dim FirstDate as Date = Date.UtcNow() 'or this: = NewDate (2008,09,10)'
Dim SecondDate as Date

SecondDate = FirstDate.AddDays(1)

这会引入全球化规则并以当前线程的文化格式打印:

HeaderLabel.Text = SecondDate.ToString()

这是不好的:

Dim BadDate as Date = CDate("2/20/2000")

实际上——即使你在这种情况下强制 CDate 使用正确的文化(InvariantCulture)也可以:

Dim OkButBadPracticeDate as Date = CDate("2/20/2000", CultureInfo.InvariantCulture)

如果您想强制所有内容为特定文化,则需要将执行线程文化和 UI 文化设置为所需的文化(en-US、invariant 等)。

确保您没有将日期作为字符串进行任何工作——确保它们是实际的 Date 对象!

于 2008-09-11T21:22:00.277 回答
0

好的,我不确定您要在这里做什么:

  • 您发布的代码不是.NET,您要移植吗?
  • DateTime 不能声明为常量。
  • DateTime 是一种数据类型,因此一旦初始化,它们的初始化格式就无关紧要了。
  • 如果您需要一个常量值,那么只需创建一个始终返回相同 DateTime 的方法。

例如:

public static DateTime SadDayForAll()
{
    return new DateTime(2001, 09, 11);
}

更新

你到底是从哪里弄来的?!

  • C# 和 VB.NET 之间存在差异,这突出了其中之一
  • Date不是.NET 数据类型- DateTime是。
  • 看起来您可以在 VB.NET 中创建 DateTime 常量,但有一些限制
  • 该方法可以帮助您,因为您无法从变量(即可选参数)创建常量。这甚至没有意义。
于 2008-09-11T20:17:50.243 回答
0

好吧,我更了解你来自哪里..

怎么样:

  • 创建一个返回日期常量的静态方法。这克服了国际问题,因为它作为特定的 DateTime 值返回。
  • 现在我记得我 VB6 时代的可选参数,但你能不能不只是重载方法?如果您使用的是没有日期的重载方法,只需将其从静态中拉出来?

编辑:如果您不确定我的意思并想要一个代码示例,只需评论这篇文章,我会添加一个。

于 2008-09-11T21:03:25.657 回答