.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初始化。