【C#メモ】WindowsAPI:GetLocalTime関数

このAPIは現在時刻を取得する際に使用します。
同じようなAPIにGetSystemTimeがありますが、
GetLocalTimeはタイムゾーンを考慮して時間を取得するようです。

VB6・VBAではNow、.NET FrameworkではDateTime.Nowを使えばほぼ事足りますが、
一応サンプルは書いておきます。

概要
void GetLocalTime(LPSYSTEMTIME lpSystemTime)
機能 現在のローカル日時を取得
引数 lpSystemTime 日時を格納する値 LPSYSTEMTIME
(*LPSYSTEMTIME = SYSTEMTIME)
戻り値 なし
SYSTEMTIME構造体
メンバー 説明
wYearWORD
(unsigned short)
wMonthWORD
(unsigned short)
月(1月=1)
wDayOfWeekWORD
(unsigned short)
曜日(日曜=0, 月曜=1)
wDayWORD
(unsigned short)
wHourWORD
(unsigned short)
wMinuteWORD
(unsigned short)
wSecondWORD
(unsigned short)
wMillisecondsWORD
(unsigned short)
ミリ秒
使用例:現在時刻を取得
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
static extern void GetLocalTime(out SYSTEMTIME lpSystemTime);

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
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 wMilliseconds;
}

void Sample()
{
    String[] weekStr = new String[] { "日", "月", "火", "水", "木", "金", "土" };

    //現在日時を取得
    SYSTEMTIME t;
    GetLocalTime(out t);

    //現在日付を出力
    Console.WriteLine(String.Format("{0,0:D4}年{1,0:D2}月{2,0:D2}日({3})", 
                                t.wYear, 
                                t.wMonth, 
                                t.wDay, 
                                weekStr[t.wDayOfWeek]));

    //現在時刻を出力
    Console.WriteLine(String.Format("{0,0:D2}時{1,0:D2}分{2,0:D2}.{3}秒",
                                t.wHour,
                                t.wMinute,
                                t.wSecond,
                                t.wMilliseconds));
}
2012年07月02日(月)
13時06分46.986秒


コメント
従って、Win32 APIやDLL関数に渡す構造体を定義する場合は、そのメンバの配置方法を変更する必要がある。これを実現するには、構造体に対してStructLayout属性(System.Runtime.InteropServices名前空間)を設定する。このとき、配置方法としてLayoutKind列挙体(System.Runtime.InteropServices名前空間)のメンバのいずれかを指定する。C言語などの構造体と同様に、メンバが宣言された順に配置されるようにするには、LayoutKind.Sequentialという値を指定すればよい。

SYSTEMTIME構造体はネイティブな構造体です。

[StructLayout(LayoutKind.Sequential)]
struct SYSTEMTIME {
...
};
  • Naohiro19
  • 2015/06/21 9:09 AM
>Naohiro19さん
省略しても動作したのでついつい省いてしまいましたが、
やっぱり書いておいた方がよさそうですね。。。
記事にも追記しました。ご指摘ありがとうございました。
コメントする








    
この記事のトラックバックURL
トラックバック