.NET日期常量(具有全球化)

时间:2020-03-05 18:51:46  来源:igfitidea点击:

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

我试过了:

' 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)

解决方案

回答

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

  • 我们发布的代码不是.NET,我们是否要移植?
  • 日期时间不能声明为常量。
  • DateTime是一种数据类型,因此一旦初始化,就与它们的初始化格式无关。
  • 如果需要一个恒定值,则只需创建一个始终返回相同DateTime的方法即可。

例如:

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

更新

你到底从哪里弄来的?

  • C#和VB.NET之间存在差异,这突出了其中之一。
  • 日期不是.NET数据类型-日期时间是。
  • 看起来我们可以在VB.NET中创建DateTime常量,但存在局限性
  • 该方法可以,因为我们无法从变量(即可选参数)创建const。那甚至都没有道理。

回答

根据Microsoft文档,

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

我们是在说这是不正确的,而且解析受当前语言环境的影响吗?

编辑:我们尝试使用4位数的年份吗?

回答

好的,我了解我们来自哪里。

怎么样:

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

编辑:如果我们不确定我的意思,并想要一个代码示例,只需评论一下这篇文章,我就会继续讨论。

回答

一旦将数据放入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,不变式等)。

确保我们没有使用日期作为字符串来做任何工作-确保它们是实际的Date对象!

回答

如果查看语句生成的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初始化。