次の方法で共有


固有カルチャの日付と時刻の形式指定

DateTime 構造体には、カルチャを認識して DateTime を操作できる DateTime.ToStringDateTime.Parse などのメソッドがあります。カルチャに基づいて DateTime の形式を指定して表示するには、DateTimeFormatInfo クラスを使用します。DateTimeFormatInfo は、カルチャに基づいて DateTime 値を形式指定して表示する方法を定義します。たとえば ShortDatePattern を使用すると、2001 年 2 月 1 日という日付の形式は、"en-US" カルチャの場合には 2/1/2001 となり、"en-GB" カルチャの場合には 01/02/2001 となります。

固有カルチャまたはインバリアント カルチャの DateTimeFormatInfo インスタンスを作成できますが、ニュートラル カルチャの DateTimeFormatInfo インスタンスは作成できません。ニュートラル カルチャでは、正しい日付形式を表示するために必要な情報が不足しています。ニュートラル カルチャを使用して DateTimeFormatInfo インスタンスを作成しようとすると、例外がスローされます。DateTime 形式指定を使用する方法の詳細と例については、「日付と時刻の書式指定文字列」を参照してください。

CurrentThread.CurrentCulture が "en-US" (米国の英語) に設定され、次に "de-DE" (ドイツのドイツ語) に設定されるときに DateTimeFormatInfo.ShortDatePattern を使用して現在の日付を表示するコード例を次に示します。

Imports System
Imports System.Globalization
Imports System.Threading

Public Class FormatDate
   
   Public Shared Sub Main()
      Dim dt As DateTime = DateTime.Now
      ' Sets the CurrentCulture property to U.S. English.
      Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
      ' Displays dt, formatted using the ShortDatePattern
      ' and the CurrentThread.CurrentCulture.
      Console.WriteLine(dt.ToString("d"))
      
      ' Creates a CultureInfo for German in Germany.
      Dim ci As New CultureInfo("de-DE")
      ' Displays dt, formatted using the ShortDatePattern
      ' and the CultureInfo.
      Console.WriteLine(dt.ToString("d", ci))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class FormatDate
{
   public static void Main()
   {
      DateTime dt = DateTime.Now;
      // Sets the CurrentCulture property to U.S. English.
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
      // Displays dt, formatted using the ShortDatePattern
      // and the CurrentThread.CurrentCulture.
      Console.WriteLine(dt.ToString("d"));
      
      // Creates a CultureInfo for German in Germany.
      CultureInfo ci = new CultureInfo("de-DE");
      // Displays dt, formatted using the ShortDatePattern
      // and the CultureInfo.
      Console.WriteLine(dt.ToString("d", ci));
   }
}

このコードを 2001 年 7 月 9 日に実行すると、出力は次のようになります。

7/9/2001
09.07.2001

タイム ゾーンの使用

DateTime 構造体のメソッドとプロパティは、計算処理や比較処理では常に現地のタイム ゾーンを使用します。DateTime.Parse メソッドと DateTime.ParseExact メソッドを使用するときには、この点について考慮してください。これらのメソッドにより提供されるオーバーロードによって、日付と時刻の文字列表現を DateTime 型の表現に変換できます。また、固有カルチャに合わせて DateTime の形式を指定できます。これらのメソッドへ渡す文字列にタイム ゾーンを指定しないと、解析済みの日付と時刻が返されますが、タイム ゾーン調整は実行されません。日付と時刻は、システムのタイム ゾーン設定に基づいています。これらのメソッドでは、タイム ゾーン オフセットが指定されると、日付と時刻の文字列が解析され、世界協定時刻 (UTC: Coordinated Universal Time) に変換されてから、ローカル システムの時刻に変換されます。世界協定時刻は、以前はグリニッジ標準時刻 (GMT: Greenwich Mean Time) と呼ばれていました。

現地時刻の DateTime を UTC の等価 DateTime に変換するには、DateTime.ToUniversalTime メソッドを使用します。日付と時刻の文字列を解析し、この文字列を UTC の DateTime に変換するには、DateTime.Parse メソッドまたは DateTime.ParseExact メソッドで DateTimeStyles 列挙体の AdjustToUniversal 値を使用します。この DateTime 操作を次のコード例に示します。このコード例では、現地時刻の DateTime が作成されてから、この DateTime が UTC の等価 DateTime へ変換されます。どちらの DateTime 型も文字列へ変換され、コンソールへ出力されます。この 2 つの文字列には、ローカルなタイム ゾーンと世界協定時刻 (UTC) との間の UTC オフセット分の差があります。さまざまなタイム ゾーンの UTC オフセットの詳細については「GetUtcOffset メソッド」を参照してください。これらの文字列を DateTime 型へ再度変換するときには、DateTime.ParseExact メソッドが使用されます。utcdt に格納されているタイム ゾーン情報を取り込むため、DateTime.ParseExact メソッドのパラメータとして AdjustToUniversal 値を指定する必要があります。

Imports System
Imports System.Globalization
Imports System.Threading

Public Class TimeZoneSample
   Public Shared Sub Main()
      Dim en As New CultureInfo("en-US")
      Thread.CurrentThread.CurrentCulture = en

      ' Creates a DateTime for the local time.
      Dim dt As New DateTime(2001, 7, 13, 4, 0, 0)

      ' Converts the local DateTime to the UTC time.
      Dim utcdt As DateTime = dt.ToUniversalTime()

      ' Defines a custom string format to display the DateTime.
      ' zzz specifies the full time zone offset.
      Dim format As [String] = "MM/dd/yyyy hh:mm:sszzz"

      ' Converts the local time to a string
      ' using the custom format string and display.
      Dim str As [String] = dt.ToString(format)
      Console.WriteLine(str)

      ' Converts the UTC time to a string
      ' using the custom format string and display.
      Dim utcstr As [String] = utcdt.ToString(format)
      Console.WriteLine(utcstr)

      ' Converts the string back to a local DateTime and displays it.
      Dim parsedBack As DateTime = DateTime.ParseExact(str, format, 
            en.DateTimeFormat)
      Console.WriteLine(parsedBack)

      ' Converts the string back to a UTC DateTime and displays it.
      ' If you do not use the DateTime.ParseExact method that takes
      ' a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
      ' will not include the time zone information. 
      Dim parsedBackUTC As DateTime = DateTime.ParseExact(str, format, _
            en.DateTimeFormat, DateTimeStyles.AdjustToUniversal)
      Console.WriteLine(parsedBackUTC)
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class TimeZoneSample
{
   public static void Main()
   {
      CultureInfo en = new CultureInfo("en-US");
      Thread.CurrentThread.CurrentCulture = en;

      // Creates a DateTime for the local time.
      DateTime dt = new DateTime(2001, 7, 13, 4, 0, 0);

      // Converts the local DateTime to the UTC time.
      DateTime utcdt = dt.ToUniversalTime();

      // Defines a custom string format to display the DateTime value.
      // zzzz specifies the full time zone offset.
      String format = "MM/dd/yyyy hh:mm:sszzz";

      // Converts the local DateTime to a string 
      // using the custom format string and display.
      String str = dt.ToString(format);
      Console.WriteLine(str);

      // Converts the UTC DateTime to a string 
      // using the custom format string and display.
      String utcstr = utcdt.ToString(format);
      Console.WriteLine(utcstr);

      // Converts the string back to a local DateTime and displays it.
      DateTime parsedBack =
            DateTime.ParseExact(str,format,en.DateTimeFormat);
      Console.WriteLine(parsedBack);

      // Converts the string back to a UTC DateTime and displays it.
      // If you do not use the DateTime.ParseExact method that takes
      // a DateTimeStyles.AdjustToUniversal value, the parsed DateTime
      // object will not include the time zone information.
      DateTime parsedBackUTC = DateTime.ParseExact(str,format, _
            en.DateTimeFormat, DateTimeStyles.AdjustToUniversal);
      Console.WriteLine(parsedBackUTC);
   }
}

このコードを実行すると、次の出力が生成されます。

07/13/2001 04:00:00-07:00
07/13/2001 11:00:00-07:00
7/13/2001 4:00:00 AM
7/13/2001 11:00:00 AM

DateTime のメンバの使用

DateTime 構造体のメソッドを使用するときには、DateTime.DayDateTime.MonthDateTime.YearDateTime.AddDays などのメンバがグレゴリオ暦に基づいている点に注意してください。アプリケーションのコードで現在の暦を変更したり、コントロール パネルの [地域のオプション] ダイアログ ボックスで日付と時刻の設定を変更したりしても、これらのメソッドの計算処理にはグレゴリオ暦が使用されます。このため、これらのメソッドが実行する算術演算処理が、ユーザーの設定によってエラーとなることはありません。カルチャを認識して現在の暦に基づく日付と時刻の処理を実行できるようにするには、DateTimeFormatInfo.Calendar プロパティを使用して、Calendar クラスの Calendar.GetDayOfMonthCalendar.GetMonthCalendar.GetYearCalendar.AddDays などのメソッドを呼び出す必要があります。DateTime メンバにより返される値と、Calendar クラス メンバにより返される値の相違の例については、「固有カルチャに対応した暦の使用」を参照してください。

DateTime 構造体を使用するときには、DateTime が値型であり、変更できない点に注意してください。したがって DateTime.AddDays などの操作では、既存の値を増分する代わりに、新しい DateTime 値が返されます。dt = dt.AddDays(1) というステートメントを使用して DateTime を 1 日増分する方法を次の例に示します。

Imports System
Imports System.Globalization
Imports System.Threading
Imports Microsoft.VisualBasic

Public Class TestClass
   
   Public Shared Sub Main()
      Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
      
      Dim dt As DateTime = DateTime.Now
      Console.WriteLine(ControlChars.Newline + " Today is {0}", _
         DateTime.Now.ToString("d"))
      
      ' Increments dt by one day.
      dt = dt.AddDays(1)
      Console.WriteLine(ControlChars.Newline + " Tomorrow is {0}", _
         dt.ToString("d"))
   End Sub
End Class
using System;
using System.Globalization;
using System.Threading;

public class TestClass
{
   public static void Main()
   {
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

      DateTime dt = DateTime.Now;
      Console.WriteLine("Today is {0}", DateTime.Now.ToString("d"));

      // Increments dt by one day.
      dt = dt.AddDays(1);
      Console.WriteLine("Tomorrow is {0}", dt.ToString("d"));

   }
}

このコードを 2001 年 8 月 3 日に実行すると、出力は次のようになります。

Today is 8/3/2001
Tomorrow is 8/4/2001

参照

関連項目

DateTime

概念

日付と時刻の書式指定文字列

その他の技術情報

エンコーディングとローカリゼーション