كيفية الحصول على التاريخ والوقت الحالي في UTC من ماكرو Excel VBA
سؤال
هل هناك طريقة في اكسل VBA ماكرو للحصول على التاريخ والوقت الحالي في تنسيق UTC؟
ويمكن أن أدعو Now()
للحصول على الوقت الحالي في التوقيت المحلي؛ هل هناك طريقة عامة لثم تحويل هذا إلى UTC؟
والشكر
المحلول
http://excel.tips.net/Pages/T002185_Automatically_Converting_to_GMT.html
وهناك ماكرو على تلك الصفحة مع طريقة LocalTimeToUTC. يبدو أنه لن تفعل خدعة. أيضا بعض الأمثلة الصيغة إذا أردت السير في هذا الطريق.
وتحرير - رابط آخر. http://www.cpearson.com/excel/TimeZoneAndDaylightTime.aspx هذه الصفحة لديها عدة طرق لتاريخ / وقت. اختر سمك. إما أن تفعل خدعة، ولكن أشعر والثاني هو أجمل. ؛)
نصائح أخرى
وببساطة، يمكنك استخدام كائن COM لتحقيق UTC معلومات الوقت.
Dim dt As Object, utc As Date
Set dt = CreateObject("WbemScripting.SWbemDateTime")
dt.SetVarDate Now
utc = dt.GetVarDate(False)
ويمنح هذا السؤال هو القديم، لكنني قضيت بعض الوقت تجميع بعض التعليمات البرمجية نظيفة بناء على هذا وأنا أرغب في وظيفة هنا في حالة أي شخص يأتي عبر هذه الصفحة قد تجد أنه من المفيد.
وإنشاء وحدة جديدة في IDE اكسل VBA (اختياريا يعطيها اسم UtcConverter
أو مهما كانت تفضله في ورقة خصائص) ولصق في التعليمات البرمجية أدناه.
وHTH
Option Explicit
' Use the PtrSafe attribute for x64 installations
Private Declare PtrSafe Function FileTimeToLocalFileTime Lib "Kernel32" (lpFileTime As FILETIME, ByRef lpLocalFileTime As FILETIME) As Long
Private Declare PtrSafe Function LocalFileTimeToFileTime Lib "Kernel32" (lpLocalFileTime As FILETIME, ByRef lpFileTime As FILETIME) As Long
Private Declare PtrSafe Function SystemTimeToFileTime Lib "Kernel32" (lpSystemTime As SYSTEMTIME, ByRef lpFileTime As FILETIME) As Long
Private Declare PtrSafe Function FileTimeToSystemTime Lib "Kernel32" (lpFileTime As FILETIME, ByRef lpSystemTime As SYSTEMTIME) As Long
Public Type FILETIME
LowDateTime As Long
HighDateTime As Long
End Type
Public Type SYSTEMTIME
Year As Integer
Month As Integer
DayOfWeek As Integer
Day As Integer
Hour As Integer
Minute As Integer
Second As Integer
Milliseconds As Integer
End Type
'===============================================================================
' Convert local time to UTC
'===============================================================================
Public Function UTCTIME(LocalTime As Date) As Date
Dim oLocalFileTime As FILETIME
Dim oUtcFileTime As FILETIME
Dim oSystemTime As SYSTEMTIME
' Convert to a SYSTEMTIME
oSystemTime = DateToSystemTime(LocalTime)
' 1. Convert to a FILETIME
' 2. Convert to UTC time
' 3. Convert to a SYSTEMTIME
Call SystemTimeToFileTime(oSystemTime, oLocalFileTime)
Call LocalFileTimeToFileTime(oLocalFileTime, oUtcFileTime)
Call FileTimeToSystemTime(oUtcFileTime, oSystemTime)
' Convert to a Date
UTCTIME = SystemTimeToDate(oSystemTime)
End Function
'===============================================================================
' Convert UTC to local time
'===============================================================================
Public Function LOCALTIME(UtcTime As Date) As Date
Dim oLocalFileTime As FILETIME
Dim oUtcFileTime As FILETIME
Dim oSystemTime As SYSTEMTIME
' Convert to a SYSTEMTIME.
oSystemTime = DateToSystemTime(UtcTime)
' 1. Convert to a FILETIME
' 2. Convert to local time
' 3. Convert to a SYSTEMTIME
Call SystemTimeToFileTime(oSystemTime, oUtcFileTime)
Call FileTimeToLocalFileTime(oUtcFileTime, oLocalFileTime)
Call FileTimeToSystemTime(oLocalFileTime, oSystemTime)
' Convert to a Date
LOCALTIME = SystemTimeToDate(oSystemTime)
End Function
'===============================================================================
' Convert a Date to a SYSTEMTIME
'===============================================================================
Private Function DateToSystemTime(Value As Date) As SYSTEMTIME
With DateToSystemTime
.Year = Year(Value)
.Month = Month(Value)
.Day = Day(Value)
.Hour = Hour(Value)
.Minute = Minute(Value)
.Second = Second(Value)
End With
End Function
'===============================================================================
' Convert a SYSTEMTIME to a Date
'===============================================================================
Private Function SystemTimeToDate(Value As SYSTEMTIME) As Date
With Value
SystemTimeToDate = _
DateSerial(.Year, .Month, .Day) + _
TimeSerial(.Hour, .Minute, .Second)
End With
End Function
وإذا كان كل ما تحتاجه هو الوقت الحالي، يمكنك القيام بذلك مع <لأ href = "https://msdn.microsoft.com/en-us/library/ms724390٪28VS.85٪29.aspx" يختلط = "نوفولو"> GetSystemTime ، الذي ينطوي على عدد أقل من استدعاءات Win32. فهو يوفر لك البنية الوقت، مع دقة ميلي ثانية واحدة، والتي يمكنك تنسيق كيف تريد:
Private Declare PtrSafe Sub GetSystemTime Lib "Kernel32" (ByRef lpSystemTime As SYSTEMTIME)
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
والاستعمال:
Dim nowUtc As SYSTEMTIME
Call GetSystemTime(nowUtc)
' nowUtc is now populated with the current UTC time. Format or convert to Date as needed.
إذا كنت تحتاج أيضا لحساب التوقيت الصيفي، قد تجد التعليمات البرمجية التالية مفيدة:
Option Explicit
'''''''''''''''''''''''''''''''''''''''''''''''''''''
' Windows API Structures
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Type SYSTEM_TIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(0 To 31) As Integer
StandardDate As SYSTEM_TIME
StandardBias As Long
DaylightName(0 To 31) As Integer
DaylightDate As SYSTEM_TIME
DaylightBias As Long
End Type
'''''''''''''''''''''''''''''''''''''''''''''''''''''
' Windows API Imports
'''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Declare Function GetTimeZoneInformation Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Private Declare Function TzSpecificLocalTimeToSystemTime Lib "kernel32" _
(lpTimeZoneInformation As TIME_ZONE_INFORMATION, lpLocalTime As SYSTEM_TIME, lpUniversalTime As SYSTEM_TIME) As Integer
Function ToUniversalTime(localTime As Date) As Date
Dim timeZoneInfo As TIME_ZONE_INFORMATION
GetTimeZoneInformation timeZoneInfo
Dim localSystemTime As SYSTEM_TIME
With localSystemTime
.wYear = Year(localTime)
.wMonth = Month(localTime)
.wDay = Day(localTime)
End With
Dim utcSystemTime As SYSTEM_TIME
If TzSpecificLocalTimeToSystemTime(timeZoneInfo, localSystemTime, utcSystemTime) <> 0 Then
ToUniversalTime = SystemTimeToVBTime(utcSystemTime)
Else
err.Raise 1, "WINAPI", "Windows API call failed"
End If
End Function
Private Function SystemTimeToVBTime(systemTime As SYSTEM_TIME) As Date
With systemTime
SystemTimeToVBTime = DateSerial(.wYear, .wMonth, .wDay) + _
TimeSerial(.wHour, .wMinute, .wSecond)
End With
End Function
ومشروع Access بلدي يعمل مع جداول Access معظمها ترتبط الجداول MS SQL خادم. وهو مشروع DAO وكنت تجد صعوبة حتى في الحصول على sproc SQL مع GETUTCDATE () لأعود. ولكن تبعه حل بي.
-- Create SQL table with calculated field for UTCDate
CREATE TABLE [dbo].[tblUTCDate](
[ID] [int] NULL,
[UTCDate] AS (getutcdate())
) ON [PRIMARY]
GO
وإنشاء جدول Access، dbo_tblUTCDate، يرتبط عبر ODBC إلى الجدول tblUTCDate SQL.
وإنشاء استعلام الوصول لتحديد من جدول Access. أسميتها qryUTCDate.
SELECT dbo_tblUTCDate.UTCDate FROM dbo_tblUTCDate
في VBA:
Dim db as DAO.database, rs AS Recordset
Set rs = db.OpenRecordset("qryUTCDate")
Debug.Print CStr(rs!UTCDATE)
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing