トップ «前の日記(2012年09月24日) 最新 次の日記(2012年11月25日)» 編集

のろのろのろ雑記


2012年11月18日 Monoと.NET FrameworkとのDateTime.Parseの挙動の違い

_ [C#] Monoと.NET FrameworkとのDateTime.Parseの挙動の違い

Windowsで動くプログラムがLinuxだとコケる。もとい、.NET Frameworkだと動くプログラムがMonoだとコケる状況に遭遇しました。

デバッグするとDateTime.Parseでコケてたので、挙動の違いを調べてみました。

文字列 .NET Framework Mono
2012年11月18日
2012年11月18日12時00分 △ (DateTime.Parseはエラー。ParseExactで対応可)
平成24年11月18日 ×

Monoだと和暦はまったくダメで、西暦でも時刻が含まれていると DateTime.Parse では対応できないようです。困りました。


以下、詳細です。

実行環境

  • Windows 7 x86 + .NET Framework 3.5 (Visual Studio 2008)
  • Ubuntu Linux 12.04 x64 + Mono 2.10.8.1

1. 西暦を日本語表記、日付のみ

string target = "2012年11月18日";
DateTime parsed = DateTime.Parse (target);
Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 0:00:00
Mono
2012/11/18 0:00:00

2. 西暦を日本語表記、日時

string target = "2012年11月18日12時00分";
DateTime parsed = DateTime.Parse (target);
Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 12:00:00
Mono
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
  at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0
  at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:10
[ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: String was not recognized as a valid DateTime.
  at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0
  at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:10

3. 西暦を日本語表記、日時、ParseExact使用

string target = "2012年11月18日12時00分";
DateTime parsed = DateTime.ParseExact (target, "yyyy年MM月dd日HH時mm分", new CultureInfo("ja-JP"));
Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 12:00:00
Mono
2012/11/18 12:00:00

4. 和暦を日本語表記、日付のみ

string target = "平成24年11月18日";
DateTime parsed = DateTime.Parse (target);
Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 0:00:00
Mono
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime.
  at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0
  at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:11
[ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: String was not recognized as a valid DateTime.
  at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0
  at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0
  at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:11

5. 和暦を日本語表記、日付のみ、ParseExact使用

string target = "平成24年11月18日";
CultureInfo culture = new CultureInfo("ja-JP", true);
culture.DateTimeFormat.Calendar = new JapaneseCalendar();                  // 和暦使用
DateTime parsed = DateTime.ParseExact (target, "ggyy年MM月dd日", culture);
Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 0:00:00
Mono
Unhandled Exception: System.FormatException: Invalid format string
  at System.DateTime.ParseExact (System.String s, System.String[] formats, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0
  at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0
  at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in <filename unknown>:0
  at DateTimeTest.MainClass.Main (System.String[] args) [0x00022] in ***/DateTimeTest/Main.cs:14
[ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: Invalid format string
  at System.DateTime.ParseExact (System.String s, System.String[] formats, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0
  at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0
  at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in <filename unknown>:0
  at DateTimeTest.MainClass.Main (System.String[] args) [0x00022] in ***/DateTimeTest/Main.cs:14