强制 DateTime.Parse 因固定日期而失败

Forcing DateTime.Parse to Fail for Invariant Dates

提问人:John Saunders 提问时间:5/30/2014 最后编辑:CommunityJohn Saunders 更新时间:5/30/2014 访问量:1005

问:

我将简短地开始,然后在最后提供详细信息。请考虑以下代码:

CultureInfo cultureToTest = new CultureInfo("hu-HU");
Thread.CurrentThread.CurrentCulture = cultureToTest;
DateTime testDateTime = new DateTime(2014,12,13,23,24,25);
String testString = testDateTime.ToString(CultureInfo.InvariantCulture);
DateTime actualDateTime = DateTime.Parse(testString);

问题是,是否有任何可能的值会导致调用引发异常或返回错误值?cultureToTestDateTime.Parse


上下文:

这是一组单元测试。有一个代码主体,在不指定区域性的情况下调用。我担心的是,当此代码在 Invariant 或 en-US 区域性中传递日期时,代码可能会在某些区域性中失败。我建议的解决方案是更改该代码以使用DateTime.Parse

DateTime.Parse(string, CultureInfo.InvariantCulture)

在这些情况下。

为了对更改进行单元测试,我需要使用一种会使原始代码失败的区域性来调用新代码,然后显示更改后的代码将成功。DateTime.Parse(string)

问题是我还没有找到一种文化可以为我做这件事。我打算尝试制造一个,但我想我会先问一个更普遍的问题。

C# CultureInfo 日期时间分析 不变文化

评论


答:

1赞 MarcinJuraszek 5/30/2014 #1

它引发了 的异常。en-GB

这是因为固定区域性数据格式设置为 。因为它是 ,这意味着您正在尝试解析月份设置为 的日期,这是不正确的。MM/dd/yyyyen-GBdd/MM/yyyy13

对于 day 小于 的日期,将无一例外地解析输入字符串,但结果将不正确(除非日和月是相同的数字)。13

评论

0赞 John Saunders 5/30/2014
太棒了,谢谢。我正在研究“异国情调”的文化,但没有碰到任何文化。
2赞 John Koerner 5/30/2014 #2

使用此代码:

StringBuilder sb = new StringBuilder();
foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    try
    {
        Thread.CurrentThread.CurrentCulture = culture;
        DateTime testDateTime = new DateTime(2014, 12, 13, 23, 24, 25);
        String testString = testDateTime.ToString(CultureInfo.InvariantCulture);
        DateTime actualDateTime = DateTime.Parse(testString);
        Console.WriteLine(actualDateTime.Day.ToString());
    }
    catch (Exception ex)
    {
       sb.AppendLine(culture.ToString());
    }
}

Console.WriteLine(sb.ToString());

以下区域性在分析该日期时引发异常:

am
am-ET
ar
ar-AE
ar-BH
ar-DZ
ar-EG
ar-IQ
ar-JO
ar-KW
ar-LB
ar-LY
ar-MA
ar-OM
ar-QA
ar-SA
ar-SY
ar-TN
ar-YE
arn
arn-CL
as
as-IN
az
az-Cyrl
az-Cyrl-AZ
az-Latn
az-Latn-AZ
ba
ba-RU
be
be-BY
bg
bg-BG
bn
bn-BD
bn-IN
br
br-FR
bs
bs-Cyrl
bs-Cyrl-BA
bs-Latn
bs-Latn-BA
ca
ca-ES
ca-ES-valencia
co
co-FR
cs
cs-CZ
cy
cy-GB
da
da-DK
de
de-AT
de-CH
de-DE
de-LI
de-LU
dsb
dsb-DE
dv
dv-MV
el
el-GR
en-029
en-AU
en-BZ
en-GB
en-HK
en-IE
en-IN
en-JM
en-MY
en-NZ
en-SG
en-TT
en-ZW
es
es-419
es-AR
es-BO
es-CL
es-CO
es-CR
es-DO
es-EC
es-ES
es-GT
es-HN
es-MX
es-NI
es-PA
es-PE
es-PR
es-PY
es-SV
es-UY
es-VE
et
et-EE
fa
fa-IR
ff
ff-Latn
ff-Latn-SN
fi
fi-FI
fo
fo-FO
fr
fr-BE
fr-CD
fr-CH
fr-CI
fr-CM
fr-FR
fr-HT
fr-LU
fr-MA
fr-MC
fr-ML
fr-RE
fr-SN
fy
fy-NL
ga
ga-IE
gd
gd-GB
gl
gl-ES
gn
gn-PY
gsw
gsw-FR
gu
gu-IN
ha
ha-Latn
ha-Latn-NG
he
he-IL
hi
hi-IN
hr
hr-BA
hr-HR
hsb
hsb-DE
hy
hy-AM
id
id-ID
ig
ig-NG
is
is-IS
it
it-CH
it-IT
iu
iu-Cans
iu-Cans-CA
iu-Latn
iu-Latn-CA
jv
jv-Latn
jv-Latn-ID
ka
ka-GE
kk
kk-KZ
kl
kl-GL
km
km-KH
kn
kn-IN
kok
kok-IN
ky
ky-KG
lb
lb-LU
lo
lo-LA
lv
lv-LV
mg
mg-MG
mi
mi-NZ
mk
mk-MK
ml
ml-IN
mr
mr-IN
ms
ms-BN
ms-MY
mt
mt-MT
my
my-MM
nb
nb-NO
nl
nl-BE
nl-NL
nn
nn-NO
no
nqo
nqo-GN
nso
nso-ZA
oc
oc-FR
om
om-ET
or
or-IN
pa
pa-Arab
pa-Arab-PK
pa-IN
pt
pt-AO
pt-BR
pt-PT
qut
qut-GT
quz
quz-BO
quz-EC
quz-PE
rm
rm-CH
ro
ro-MD
ro-RO
ru
ru-RU
rw
rw-RW
sa
sa-IN
sah
sah-RU
sd
sd-Arab
sd-Arab-PK
se
se-FI
se-NO
sk
sk-SK
sl
sl-SI
sma-NO
smj-NO
smn
smn-FI
sms
sms-FI
sn
sn-Latn
sn-Latn-ZW
so
so-SO
sq
sq-AL
sr
sr-Cyrl
sr-Cyrl-BA
sr-Cyrl-CS
sr-Cyrl-ME
sr-Cyrl-RS
sr-Latn
sr-Latn-BA
sr-Latn-CS
sr-Latn-ME
sr-Latn-RS
sv-FI
syr
syr-SY
ta
ta-IN
ta-LK
te
te-IN
tg
tg-Cyrl
tg-Cyrl-TJ
th
th-TH
ti
ti-ER
ti-ET
tk
tk-TM
tn
tn-BW
tn-ZA
tr
tr-TR
tt
tt-RU
tzm
tzm-Latn
tzm-Latn-DZ
tzm-Tfng
tzm-Tfng-MA
uk
uk-UA
ur
ur-IN
ur-PK
uz
uz-Cyrl
uz-Cyrl-UZ
uz-Latn
uz-Latn-UZ
vi
vi-VN
wo
wo-SN
yo
yo-NG
zgh
zgh-Tfng
zgh-Tfng-MA
zh-Hant
zh-HK
zh-MO
zh-SG
zu
zu-ZA
zh-CHT

评论

0赞 John Saunders 5/30/2014
谢谢你不仅回答了这个问题,还向我展示了我懒得写你刚刚发布的代码的结果。
0赞 John Saunders 5/31/2014
多亏了你的代码,我发现“ar-SA”(阿拉伯语(沙特阿拉伯))对我来说是一种更好的文化。它不仅在 上失败,而且在 上失败。new DateTime(2014, 12, 13, 23, 24, 25)new DateTime(2001, 01, 01, 0, 0, 0)