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カルチャを指定せずに呼び出すコード本体があります。私の懸念は、このコードがインバリアントまたは 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です。en-GBこれはdd/MM/yyyy、月が に設定された日付を解析しようとしていることを意味しますが13、これは正しくありません。

日が よりも小さい日付の場合13、入力文字列は例外なく解析されますが、結果は正しくありません (日と月が同じ数でない限り)。

于 2014-05-30T01:16:21.217 に答える