1

以下のコードをVB6からC#に変換しようとしています。どこから始めればよいのかわからないのですが、おそらくVB6に夢中になっていて、一歩後退できないように思われるからでしょう。

Private Function GMT_OFFSET() As Integer
    '****DECLARE VARIABLES
    Dim dtNow As Date, dtEngland As Date
    Dim dtGMT As SYSTEMTIME
    '****GET SYSTEM TIME INFORMATION
    Call GetSystemTime(dtGMT)
    dtNow = Now
    dtEngland = dtGMT.wYear & "-" & dtGMT.wMonth & "-" & dtGMT.wDay & " " & dtGMT.wHour & ":" & dtGMT.wMinute & ":" & dtGMT.wSecond
    '****RETURN QUARTER HOURS
    GMT_OFFSET = DateDiff("n", dtEngland, dtNow) \ 15
End Function

GetSystemTimeがWin32APIであることは知っています。明らかに、.NETでPInvokeを実行するのではなく、.NETFrameworkで純粋なオブジェクトを使用します。

4

3 に答える 3

2

あなたのコードに基づいて、あなたは次のようなものを探しています:

        var dtNow = DateTime.Now;
        var dtOffset = (dtNow.ToUniversalTime().Subtract(dtNow)).TotalMinutes / 15;

世界時が現在のシステム時間よりも大きい場合は、オフセットを負に調整する必要がある場合があります。

于 2012-08-02T19:04:56.190 に答える
1

システム時間:

DateTime systemDateTime = DateTime.Now;

しかし、さらに重要なのは、システムが実行されているオフセットです。

TimeZoneInfo systemTimeZone = TimeZoneInfo.Local;
TimeSpan offset = systemTimeZone.GetUtcOffset();
Int32 offsetMinutes = offset.Hours * 60 + offset.Minutes;
于 2012-08-02T19:22:49.843 に答える
1

直訳に近い:

//Private Function GMT_OFFSET() As Integer
int GMT_OFFSET()
{
  //'****DECLARE VARIABLES
  //Dim dtNow As Date, dtEngland As Date
  DateTime dtNow, dtEngland;
  //Dim dtGMT As SYSTEMTIME
  //'****GET SYSTEM TIME INFORMATION
  //Call GetSystemTime(dtGMT)
  //dtNow = Now
  //dtEngland = dtGMT.wYear & "-" & dtGMT.wMonth & "-" & dtGMT.wDay & " " & dtGMT.wHour & ":" & dtGMT.wMinute & ":" & dtGMT.wSecond
  dtEngland = DateTime.UtcNow;
  dtNow = dtEngland.ToLocalTime;
  //'****RETURN QUARTER HOURS
  //GMT_OFFSET = DateDiff("n", dtEngland, dtNow) \ 15
  return Convert.ToInt32((dtNow - dtEngland).TotalMinutes) / 15;
//End Function
}

NB VB6のDateDiff(interval,date1,date2)結果は、に基づく間隔になりますがdate2 - date1、その逆ではありません。

しかし、ワンライナーは次のとおりです。

return Convert.ToInt32(TimeZoneInfo.Local.GetUtcOffset(DateTime.UtcNow).TotalMinutes) / 15;
于 2012-08-03T14:38:27.220 に答える