#vba #database #datetime #ms-access #ms-access-2016
Вопрос:
Я создаю базу данных, которая автоматически обновляет всю информацию на основе текущей даты пользователя.
Но есть проблема, это означает, что если у Пользователя неверные настройки даты, это означает, что вся система скомпрометирована. Единственное решение, о котором я подумал, состояло в том, чтобы получить региональные настройки пользователя и часовой пояс пользователя и использовать их, чтобы определить, неверны ли время и дата, чтобы база данных не обновлялась. Но до сих пор я не нашел СПОСОБА получить часовой пояс и региональные настройки пользователя с помощью Microsoft access. Кто-нибудь может мне помочь, пожалуйста? Я не нашел никакой функции или способа получить эти настройки пользователя в доступе. Ближе всего я подошел к этому, когда подал заявление.Языковые задания .Я действительно заблудился здесь.
Комментарии:
1. Здесь что-то не так. «Текущая дата пользователя» должна быть одинаковой для ВСЕХ пользователей. Таким образом, нет никакой «текущей даты пользователя», есть только «текущая дата».
2. Но если системная дата и время текущего пользователя могут отличаться, то для проверки вам понадобятся оба приведенных ниже решения: используйте UTC для проверки системы и используйте информацию о часовом поясе, чтобы настроить любое местное время на UTC. UTC-это золотой стандарт времени.
3. Он не добавляет никакой реальной информации для проверки текущего часового пояса машины, так как пользователь может легко настроить его.
4. вау, это действительно сработало. Я ПРОСТО использовал wscript.shell для проверки часового пояса. Программное обеспечение должно работать только с одним пользователем. Поэтому, если часовой пояс установлен неправильно, он должен запрашивать пользователя и открывать программное обеспечение только в режиме чтения. Достаточно круто?
Ответ №1:
Вы можете получить время UTC из удаленного API:
' Retrieves the current UTC date and time from a remote source.
' Split seconds (milliseconds) are rounded to the second like VBA.Now does.
'
' Documentation:
' http://worldtimeapi.org/
'
' 2018-09-11. Gustav Brock. Cactus Data ApS, CPH.
'
Public Function DateUtcNow() As Date
' ServiceUrl for time service.
Const ServiceUrl As String = "http://worldtimeapi.org/api/timezone/etc/utc.txt"
' Fixed constants.
Const Async As Boolean = False
Const StatusOk As Integer = 200
Const UtcSeparator As String = "datetime: "
Const IsoSeparator As String = "T"
' Engine to communicate with the service.
Dim XmlHttp As XMLHTTP60
Dim ResponseText As String
Dim UtcTimePart As String
Dim DateTimePart As String
Dim SplitSeconds As Double
Dim CurrentUtcTime As Date
On Error GoTo Err_DateUtcNow
Set XmlHttp = New XMLHTTP60
XmlHttp.Open "GET", ServiceUrl, Async
XmlHttp.send
ResponseText = XmlHttp.ResponseText
If XmlHttp.status = StatusOk Then
UtcTimePart = Split(ResponseText, UtcSeparator)(1)
DateTimePart = Replace(Left(UtcTimePart, 19), IsoSeparator, " ")
SplitSeconds = Val(Mid(UtcTimePart, 20, 7))
CurrentUtcTime = DateAdd("s", SplitSeconds 0.5, CDate(DateTimePart))
End If
DateUtcNow = CurrentUtcTime
Exit_DateUtcNow:
Set XmlHttp = Nothing
Exit Function
Err_DateUtcNow:
MsgBox "Error" amp; Str(Err.Number) amp; ": " amp; Err.Description, vbCritical vbOKOnly, "Web Service Error"
Resume Exit_DateUtcNow
End Function
Затем проверьте, находится ли дата/время в Now()
пределах /- 12 часов после этого.
Для этого требуется ссылка на Microsoft XML, v6.0
.
Ответ №2:
Вы можете прочитать региональные настройки из реестра.
Есть много способов чтения из реестра в VBA, которые я предпочитаю использовать WScript.Shell
, но другие используют WinAPI (более сложный, но WScript.Оболочка может быть заблокирована)
CreateObject("WScript.Shell").RegRead("HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTimeZoneInformationTimeZoneKeyName")
Для получения более подробной информации о часовом поясе вы можете использовать WinAPI.
Public 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
Public Type TIME_ZONE_INFORMATION
Bias As Long
StandardName(64) As Byte
StandardDate As SYSTEMTIME
StandardBias As Long
DaylightName(64) As Byte
DaylightDate As SYSTEMTIME
DaylightBias As Long
End Type
Const TIME_ZONE_ID_STANDARD = 1
Const TIME_ZONE_ID_DAYLIGHT = 2
Public Declare PtrSafe Function GetTimeZoneInformation Lib "Kernel32.dll" (ByRef lpTimezoneInformation As TIME_ZONE_INFORMATION) As Long
Public Function GetBiasInHours() As Long
Dim tzi As TIME_ZONE_INFORMATION
Dim IsDST As Long
IsDST = GetTimeZoneInformation(tzi)
Dim Bias As Long
If IsDST = TIME_ZONE_ID_DAYLIGHT Then
Bias = tzi.DaylightBias / 60
Else
Bias = tzi.Bias / 60
End If
GetBiasInHours = Bias
End Function
Смещение может быть использовано для расчета времени до времени UTC. Как выполнить эти вычисления, описано в документации по типу. Конечно, вы также можете использовать стандартное имя и имя дневного света, чтобы проверить, установлен ли часовой пояс должным образом. Приведите их к строкам со следующим кодом:
Dim StandardNameString As String
StandardNameString = tzi.StandardName
StandardNameString = Left(StandardNameString, InStr(StandardNameString amp; vbNullChar, vbNullChar) - 1)
Комментарии:
1. БОЖЕ мой! Я даже не знал, что это вообще существовало в первую очередь. Я даже не понимаю половины кода WinAPI, который вы там разместили. Единственным, что я мог использовать, которое действительно работало, был «WScript. Оболочка» . Большое тебе спасибо, су-су! Но я хотел бы понять, как работает WinAPI. И как тебе это так хорошо удавалось? Это удивительно, честно говоря. Большое тебе спасибо, Мужик!!!
2. К сожалению, изучать WinAPI сложно. Это очень помогает, если у вас есть опыт работы на C или вы начинаете изучать C, так как WinAPI-это API на C, который может вызывать VBA. Если вы можете писать на языке С и знаете, как типы VBA преобразуются в типы С, это не сложно, но эти необходимые данные являются довольно сложными.