

C#でシステム日付を取得し、「平成yy年mm月dd日hh時mm分ss秒」と表示したいです。  
以下の通り実装したのですが、実行結果は

6/30/2016 10:03:06 AM  
Heisei28年06月30日10時03分06秒

となります。（2016/06/30 19：03に実行）  
年については問題なく和暦に変換（2016年→Heisei28年）されます。  
ですが時間もutcではなくjstで表示したいです。（"19時03分06秒"と表示したい）  
いろいろ調べてTimezoneを取得する方法など試してみたのですが、なかなかうまくいきません。  
実装方法を教えてください。

ちなみに、実行環境についてですが、OSはXP、実行環境はpaiza.io([https://paiza.io/projects/new)です](https://paiza.io/projects/new\)%E3%81%A7%E3%81%99)。これもうまくいかない原因なのかもしれませんが、、、。当方javaのエンジニアでjavaの開発環境はあるのですがC#の環境はありません。  
テスト自動化ツールを導入するにあたり、一部C#が必要で質問しています。

[code]

    public class Hello{
    public static void Main(){
    
         //現在の時間を現地時刻で取得する
    
        System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("ja-JP", true);
        culture.DateTimeFormat.Calendar = new System.Globalization.JapaneseCalendar();
    
    
    
        System.DateTime now = System.DateTime.Now;
    
        System.Console.WriteLine(now);
        // 和暦の出力方法
        System.Console.WriteLine(now.ToString("ggyy年MM月dd日HH時mm分ss秒", culture));
    }
    
[/code]

}


CC BY-SA 3.0
2016-06-30T10:08:23.433
27216
2016-06-30T14:28:52.900
2016-06-30T11:16:00.600
76
17013
question
c#
システム日付を和暦かつ日本時間で表示したい


`CultureInfo` にはタイムゾーンの情報は含まれていませんから、別途 `TimeZoneInfo` クラスを使う必要があります。この変換を
`ToString()` 時に行うことはできないので、あらかじめ変換しておくことになります。

[code]

    DateTime now = DateTime.Now;
    // Asia/Tokyo タイムゾーンの情報を取得
    TimeZoneInfo jst = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
    // 変換元DateTimeのKindプロパティが指すタイムゾーンから、指定したタイムゾーンに変換
    DateTime now_jst = TimeZoneInfo.ConvertTime(now_jst, jst);
    Console.WriteLine(now_jst.ToString());
    
[/code]

上のコードではJSTを表すIDとして `Asia/Tokyo`
を指定していますが、これは非Windows環境でMonoを使う場合の話です。Windows環境の場合は `Tokyo Standard Time`
とします。

もっとも、日本語に設定されたWindows環境では `DateTime.Now` もJSTでの時刻を返しますし、和暦も `Heisei` ではなく `平成`
と表示されます。このようにWindows+.NET
Frameworkの場合と、paiza.ioなどの非Windows+Monoの場合とでは異なる挙動もありますから、最終的にWindows上で動作させる必要があるのであれば、ローカルに開発環境を整えることをお勧めします。

参考

  * [タイムゾーン間での時刻の変換](https://msdn.microsoft.com/ja-jp/library/bb397769\(v=vs.110\).aspx) (MSDN)
  * [時刻の種類・UTCとの時差・タイムゾーン間の変換 - Programming/.NET Framework/日付と時刻 - 総武ソフトウェア推進所](http://smdn.jp/programming/netfx/datetime/1_kind_offset_timezone/#TimeZoneInfo)


CC BY-SA 3.0
2016-06-30T12:02:46.363
27222
2016-06-30T12:12:43.453
2016-06-30T12:12:43.453
8000
8000
27216
answer


コンピューターのタイムゾーンが希望通りに設定されていないようです。unaristさんも答えられていますが、Windowsの場合はタイムゾーン一覧をレジストリから取得し、UNIX系の場合はtzinfoを使うようですので、指定の仕方が異なります。  
面倒に感じる場合、日本標準時が+9時間であることを前提に

[code]

    // UTC時刻に対して９時間ずらす
    var now = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(+9));
    
[/code]

と書くことができます。

* * *

ついでに表示方法についても２，３種類

文字列化の際に個別に指定する方法

[code]

    var cultureInfo = new CultureInfo("ja-JP");
    cultureInfo.DateTimeFormat.Calendar = new JapaneseCalendar();
    Console.WriteLine(now.ToString("gg yy年MM月dd日HH時mm分ss秒", cultureInfo));
    
[/code]

スレッドに対して書式を設定する方法

[code]

    CultureInfo.CurrentCulture = new CultureInfo("ja-JP");
    CultureInfo.CurrentCulture.DateTimeFormat.Calendar = new JapaneseCalendar();
    Console.WriteLine("{0:gg yy年MM月dd日HH時mm分ss秒}", now);
    Console.WriteLine($"{now:gg yy年MM月dd日HH時mm分ss秒}");
    
[/code]

最後の行は[補間文字列](https://msdn.microsoft.com/ja-jp/library/dn961160.aspx)というものです。


CC BY-SA 3.0
2016-06-30T14:28:52.900
27227
2016-06-30T14:28:52.900
4236
27216
answer