2

我会简短地开始,然后在最后给出细节。考虑以下代码:

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

问题是是否有任何可能的值cultureToTest会导致DateTime.Parse调用抛出异常或返回错误的值?


语境:

这是一组单元测试。有一段代码在DateTime.Parse没有指定文化的情况下调用。我担心的是,当此代码在 Invariant 或 en-US 文化中传递一个日期时,该代码可能会在某些文化中失败。我提出的解决方案是更改要使用的代码

DateTime.Parse(string, CultureInfo.InvariantCulture)

在这些情况下。

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

问题是我还没有找到一种文化可以为我做到这一点。我将尝试制造一个,但我想我会先问更一般的问题。

4

2 回答 2

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
于 2014-05-30T01:16:38.240 回答
1

它为en-GB.

这是因为不变的文化数据格式设置为MM/dd/yyyy. For en-GBit's dd/MM/yyyy,这意味着您正在尝试解析将月份设置为 的日期13,这是不正确的。

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

于 2014-05-30T01:16:21.217 回答