2

xml ファイルから日時を読み取るアプリに以下のコードがあります。

private void getConfig()
    {
    XDocument xdocument = XDocument.Load(@"C:\Salesforce\SFDIAuto\config.xml");
    IEnumerable<XElement> tasks = xdocument.Elements();
    foreach (var task in tasks)
        {
       IEnumerable<XElement> query = task.Elements("Triggers").Elements("CalendarTrigger");
       foreach (XElement result in query)
           {            
            CalendarTrigger[0] = (result.Element("Next").Value != "") ? Convert.ToDateTime(result.Element("Next").Value).ToString("MM/dd/yyyy HH:mm:ss") :
                    DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss");
            dScanDate.Value = Convert.ToDateTime(CalendarTrigger[0]);
            dScanTime.Value = Convert.ToDateTime(CalendarTrigger[0]);

            CalendarTrigger[1] = (result.Element("Last").Value != "") ? Convert.ToDateTime(result.Element("Last").Value).ToString("dd/MM/yyyy HH:mm:ss") : "";
            CalendarTrigger[2] = result.Element("Result").Value;
            CalendarTrigger[3] = "Ready";
            if (Convert.ToDateTime(result.Element("Next").Value) < DateTime.Now)
                    CalendarTrigger[3] = "Missed/Overdue";

                CalendarTrigger[4] = result.Element("ScheduleByDay").Element("DaysInterval").Value;

xml 構成ファイルの形式は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<config>
    <Triggers>
        <CalendarTrigger>
            <Start>2012-07-02T18:00:00</Start>
            <Next>2013-11-13T21:00:00</Next>
            <Last>2013-11-12T21:00:00</Last>
            <Result>Success</Result>
            <Enabled>true</Enabled>
            <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
            </ScheduleByDay>
       </CalendarTrigger>
    </Triggers>

私の開発用 PC ではエラーは発生しませんが、ライブ サーバーではこの手順で常にエラーがスローされます。

文字列は有効な DateTime として認識されませんでした。

見ている値は次のとおりです。

CalendarTrigger[0] = "11/13/2013 21:00:00"

私の開発用 PC で問題なく動作するのを見て、環境の違いを見つけるにはどうすればよいですか? また、この部分をどこでも動作するように再コーディングするにはどうすればよいでしょうか?

4

2 に答える 2

4

問題は特定の機械文化にあります。Convert.ToDateTimeシステム定義のカルチャを使用して文字列を解析します。あるシステムでは11/13/2013が有効な日付になりますが、別のシステム (たとえば、月が 2 位になるウクライナ語:) では有効な日付ではなく、有効な日付は13/11/2013である必要があります。

数値/日付/ロケール固有のデータを文字列に格納する場合は、常にクライアント カルチャを考慮する必要があります。InvarianCulture物事を明確にするために、文化固有のデータを保存/変換するために使用することをお勧めします。

文字列フィールドに格納された不変の日付のサンプル:

var invariantStringDate = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture.DateTim‌​‌​eFormat);
于 2013-11-13T11:42:12.467 に答える
2

からConvert.ToDateTime Method (String)

value が null でない場合、戻り値は、現在のカルチャ用に初期化された DateTimeFormatInfo オブジェクトの書式設定情報を使用して、value で DateTime.Parse メソッドを呼び出した結果です。 value 引数には、DateTimeFormatInfo トピックで説明されているいずれかの形式での日付と時刻の表現が含まれている必要があります。

あなたの場合、この形式は現在の文化では説明されていないようです。私のお金はあなたの文化のためのものです 月に13日かかります :)

DateTime.ParseExactこの代わりに、CultureInfo.InvariantCulturelike;を使用できます。

string s = "11/13/2013 21:00:00";
DateTime dt = DateTime.ParseExact(s, "MM/dd/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
Console.WriteLine(dt);

出力は次のようになります。

11/13/2013 9:00:00 PM

ここにdemonstration.

于 2013-11-13T11:43:48.363 に答える