DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

システム時計の日時を設定する

システム日時を勝手に変更してしまうことがよいことかという議論は置いておき、システム日時を変更する方法を2つ紹介します。

VB.NETのToday, DateString, TimeOfDay, TimeStringを使用する方法

VB.NETでは、Todayプロパティ及びDateStringプロパティでシステム日付を、TimeOfDayプロパティ及びTimeStringプロパティでシステム時刻を設定できます。VB.NET以外でもMicrosoft.VisualBasic.dllを参照することにより、これらのプロパティにアクセスできます。

VB.NET
コードを隠すコードを選択
'システム日付を2005/1/2にする
Today = New DateTime(2005, 1, 2, 0, 0, 0)
'システム日付を2005/2/3にする
DateString = "2005-2-3"

'システム時刻を6:15:30にする
TimeOfDay = New DateTime(2000, 1, 1, 6, 15, 30)
'システム時刻を8:25:45にする
TimeString = "8:25:45"
C#
コードを隠すコードを選択
//システム日付を2005/1/2にする
Microsoft.VisualBasic.DateAndTime.Today =
    new DateTime(2005, 1, 2, 0, 0, 0);
//システム日付を2005/2/3にする
Microsoft.VisualBasic.DateAndTime.DateString =
    "2005-2-3";

//システム時刻を6:15:30にする
Microsoft.VisualBasic.DateAndTime.TimeOfDay =
    new DateTime(2000, 1, 1, 6, 15, 30);
//システム時刻を8:25:45にする
Microsoft.VisualBasic.DateAndTime.TimeString =
    "8:25:45";

Win32 APIを使用する方法

また、Win32 APIのSetLocalTime関数を使用してシステム日時を変更することもできます。下のSetNowDateTimeメソッドは、DateTime型で日時を指定してシステム日時を変更するメソッドです。

VB.NET
コードを隠すコードを選択
<StructLayout(LayoutKind.Sequential)> _
Public Structure SystemTime
    Public wYear As Short
    Public wMonth As Short
    Public wDayOfWeek As Short
    Public wDay As Short
    Public wHour As Short
    Public wMinute As Short
    Public wSecond As Short
    Public wMiliseconds As Short
End Structure

<DllImport("kernel32.dll")> _
Public Shared Function SetLocalTime( _
    ByRef sysTime As SystemTime) As Boolean
End Function

''' <summary>
''' 現在のシステム日時を設定する
''' </summary>
''' <param name="dt">設定する日時</param>
Public Shared Sub SetNowDateTime(ByVal dt As DateTime)
    'システム日時に設定する日時を指定する
    Dim sysTime As New SystemTime
    sysTime.wYear = dt.Year
    sysTime.wMonth = dt.Month
    sysTime.wDay = dt.Day
    sysTime.wHour = dt.Hour
    sysTime.wMinute = dt.Minute
    sysTime.wSecond = dt.Second
    sysTime.wMiliseconds = dt.Millisecond

    'システム日時を設定する
    SetLocalTime(sysTime)
End Sub
C#
コードを隠すコードを選択
//using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
    public ushort wYear;
    public ushort wMonth;
    public ushort wDayOfWeek;
    public ushort wDay;
    public ushort wHour;
    public ushort wMinute;
    public ushort wSecond;
    public ushort wMiliseconds;
}

[DllImport("kernel32.dll")]
public static extern bool SetLocalTime(
    ref SystemTime sysTime);

/// <summary>
/// 現在のシステム日時を設定する
/// </summary>
/// <param name="dt">設定する日時</param>
public static void SetNowDateTime(DateTime dt)
{
    //システム日時に設定する日時を指定する
    SystemTime sysTime = new SystemTime();
    sysTime.wYear = (ushort) dt.Year;
    sysTime.wMonth = (ushort) dt.Month;
    sysTime.wDay = (ushort) dt.Day;
    sysTime.wHour = (ushort) dt.Hour;
    sysTime.wMinute = (ushort) dt.Minute;
    sysTime.wSecond = (ushort) dt.Second;
    sysTime.wMiliseconds = (ushort) dt.Millisecond;
    //システム日時を設定する
    SetLocalTime(ref sysTime);
}

NT系OSでうまくいかない時

NT系のOSでシステム日時を変更するには、SE_SYSTEMTIME_NAME特権が必要です。特権を有効にする方法は「コンピュータの電源切る、システムのシャットダウン、再起動、ログオフする」でAdjustTokenメソッドとして説明しています。そのAdjustTokenメソッドで「SE_SHUTDOWN_NAME = "SeShutdownPrivilege"」となっている箇所を「SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege"」とし、それ以降の「SE_SHUTDOWN_NAME」を「SE_SYSTEMTIME_NAME」に置き換えてください。

Vista以降のOSでうまくいかない時

Windows Vistaで導入されたUAC(ユーザーアカウント制御)によって、ほとんどの場合、普通に実行しただけではシステム日時を変更できません。この場合、管理者権限で実行するか、UACを無効にするかしなければなりません。詳しくは、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。

  • 履歴:
  • 2011/12/09 NT系OS、Vista以降のOSでうまく行かない時の対処法を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。