読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Mobile(.NET Compact Framework)でシステム時刻を取得/設定する

ネイティブの GetSystemTime / SetSystemTime 関数を使うことで、デバイスのシステム時刻を取得/設定出来ます。

GetSystemTime 関数は、グリニッジ標準時(UTC)でシステム時刻を返してきますので注意してください。グリニッジ標準時(UTC)から9時間進めると日本標準時が求める事が出来ます。

以下にサンプルコードを示します。

ネイティブ関数とやり取りする為の構造体を定義

VB.NET

        ' デフォルトの名前空間に指定しておきます
    'Imports System.Runtime.InteropServices

    ' SYSTEMTIME 構造体は日付と時間を表します。
    Public Structure SYSTEMTIME
        Public wYear As UInt16
        Public wMonth As UInt16
        Public wDayOfWeek As UInt16
        Public wDay As UInt16
        Public wHour As UInt16
        Public wMinute As UInt16
        Public wSecond As UInt16
        Public wMilliseconds As UInt16
    End Structure

    ' 現在のシステム日時を取得します
    <DllImport("coredll.dll")> _
    Private Shared Function GetSystemTime( _
       ByRef lpSystemTime As SYSTEMTIME)  As UInt32
    End Function

    ' 現在のシステム日時を設定します。
    <DllImport("coredll.dll")> _
    Private Shared Function SetSystemTime( _
       ByRef lpSystemTime As SYSTEMTIME)  As UInt32
    End Function

C#

    // デフォルトの名前空間に指定しておきます
    //Imports System.Runtime.InteropServices
        
    // SYSTEMTIME 構造体は日付と時間を表します。
    public struct SYSTEMTIME
    {
        public UInt16 wYear;
        public UInt16 wMonth;
        public UInt16 wDayOfWeek;
        public UInt16 wDay;
        public UInt16 wHour;
        public UInt16 wMinute;
        public UInt16 wSecond;
        public UInt16 wMilliseconds;
    }
    
    // 現在のシステム日時を取得します
    [DllImport("coredll.dll")]
    private static extern UInt32 GetSystemTime(
        ref SYSTEMTIME lpSystemTime);
    
    // 現在のシステム日時を設定します。
    [DllImport("coredll.dll")]
    private static extern UInt32 SetSystemTime(
        ref SYSTEMTIME lpSystemTime);

システム時刻を取得する

VB.NET

    Public Sub GetTime()

        ' GetSystemTime 関数から現在のシステム時刻を取得する
        Dim st As New SYSTEMTIME
        GetSystemTime(st)

        ' 現在の時間を表示します
        Dim curTime = String.Format("現在時刻 {0}:{1}", _
                                    st.wHour.ToString(), _
                                    st.wMinute.ToString())
        MessageBox.Show(curTime)

    End Sub

C#

    public void GetTime()
    {
        // GetSystemTime 関数から現在のシステム時刻を取得する
        SYSTEMTIME st = new SYSTEMTIME();
        GetSystemTime(st);
        
        // 現在の時間を表示します
        var curTime = string.Format("現在時刻 {0}:{1}", 
                                    st.wHour.ToString(), 
                                    st.wMinute.ToString());
            
        MessageBox.Show(curTime);
    }

実行結果

上記のサンプルコードを実行したところ、システム時刻を取得してメッセージボックスに表示します。

f:id:ch3cooh393:20140731141302p:plain

システム時刻を設定する

1時間進めます。

VB.NET

    Public Sub SetTime()

        ' GetSystemTime 関数から現在のシステム時刻を取得する
        Dim st As New SYSTEMTIME
        GetSystemTime(st)

        ' 1時間早めた時間をシステム時刻へ設定します
        st.wHour = Convert.ToUInt16(((CInt(st.wHour) + 1)) Mod 24)
        SetSystemTime(st)

    End Sub

C#

    public void SetTime()
    {
        // GetSystemTime 関数から現在のシステム時刻を取得する
        SYSTEMTIME st = new SYSTEMTIME();
        GetSystemTime(st);
        
        // 1時間早めた時間をシステム時刻へ設定します
        st.wHour = Convert.ToUInt16((((int)st.wHour + 1)) % 24);
            
        SetSystemTime(st);
    }

参照

関連記事

Windows Mobile(.NET Compact Framework)を使ってアプリ開発する際に逆引きとしてお使いください。