Текущая дата получается в формате, соответствующем выставленному в винде языку и региональным стандартам.
Как перевести ее в формат "en-US" (English USA)?
В msdn'e нашел только реализацию на .NET через класс CultureInfo, а для vb6 найти не удалось.
Locale = GetUserDefaultLCID()
iRet = SetLocaleInfo(Locale, LOCALE_SSHORTDATE, DateFormat) ' эта строка работает отлично
iRet = SetLocaleInfo(Locale, LOCALE_SABBREVMONTHNAME9, "Sep") ' а вот эта выдает еррор
Viper писал(а):Возможно размер строки в третьем параметре маловат.
alibek писал(а):Зачем их вообще менять?
Посмотри в справочнике нужный LCID и задавай его константой.
Andrey Fedorov писал(а):А для чего, собственно, нужна дата в амер-формате?
User Locale: Or "Standards and formats" in Windows XP. This per user variable defines user's preferences for formatting locale sensitive data (date, time, currency ...). Your application should be using that setting to display formatted data. Use GetUserDefaultLCID to retrieve that value. No API available to set this locale (by design).
• In Windows 2000, users can change this in the "Your locale (location)" option in the "Settings for the current user" field of the "General" tab of the "Regional Options" Control Panel applet (can be set on the fly).
• In Windows XP, users can change it thru the Region Options tab of the Regional and Language Options applet (can be set on the fly).
Public Declare Function VariantChangeTypeEx Lib "oleaut32.dll" (ByVal pvArgDest As Long, _
ByVal pvArgSrc As Long, ByVal LCID As Long, ByVal wFlags As Integer, ByVal VarType As Integer) As Long
'...
'-----------------------------------------------------------
' SUB: ParseDateTime
'
' Same as CDate with a string argument, except that it
' ignores the current localization settings. This is
' important because SETUP.LST always uses the same
' format for dates.
'
' IN: [strDate] - string representing the date in
' the format mm/dd/yy or mm/dd/yyyy
' OUT: The date which strDate represents
'-----------------------------------------------------------
'
Private Function ParseDateTime(ByVal strDateTime As String) As Date
Dim Var As Variant
Var = strDateTime
If 0 = VariantChangeTypeEx(VarPtr(Var), VarPtr(Var), &H409, 0, vbDate) Then
ParseDateTime = Var
Else
'Raise same error as CDate
Err.Raise 13
End If
End Function
Locale = GetUserDefaultLCID()
iRet = SetLocaleInfo(Locale, LOCALE_SSHORTDATE, DateFormat) ' эта строка работает отлично
iRet = SetLocaleInfo(Locale, LOCALE_SABBREVMONTHNAME9, "Sep") ' а вот эта выдает еррор
Номер ошибки 1004, т.е. ERROR_INVALID_FLAGS.
Была мысль, что аббревиатуры названий месяцев являются рид онли и берутся сами от полных названий, но при попытке смены LOCALE_SMONTHNAME9 появлялась та же ошибка.
Const LOCALE_SSHORTDATE As Long = &H1F
Const LOCALE_SABBREVMONTHNAME9 As Long = &H4C
Gogic писал(а):Константы точно объявлены?
Vi писал(а):Есть еще вариант, описан в Studio\VB98\Wizards\PDWizard\Setup1\SETUP1.BAS
Select Case Format$(Date, "mmm")
Case MonthName(1, True)
dateEng = "jan" & Format$(Date, " dd yyyy")
Case MonthName(2, True)
dateEng = "feb" & Format$(Date, " dd yyyy")
Case MonthName(3, True)
dateEng = "mar" & Format$(Date, " dd yyyy")
Case MonthName(4, True)
dateEng = "apr" & Format$(Date, " dd yyyy")
Case MonthName(5, True)
dateEng = "may" & Format$(Date, " dd yyyy")
Case MonthName(6, True)
dateEng = "jun" & Format$(Date, " dd yyyy")
Case MonthName(7, True)
dateEng = "jul" & Format$(Date, " dd yyyy")
Case MonthName(8, True)
dateEng = "aug" & Format$(Date, " dd yyyy")
Case MonthName(9, True)
dateEng = "sep" & Format$(Date, " dd yyyy")
Case MonthName(10, True)
dateEng = "oct" & Format$(Date, " dd yyyy")
Case MonthName(11, True)
dateEng = "nov" & Format$(Date, " dd yyyy")
Case MonthName(12, True)
dateEng = "dec" & Format$(Date, " dd yyyy")
End Select
Adept писал(а):В результате в dateEng всегда дата в нужном формате, независимо от регионального стандарта.
Но спасибо за наводящие вопросы
Debug.Print Mid$("janfebmaraprmayjunjulaugsepoctnovdec",3 * Month(Date)-2,3) & Format$(Date, " dd yyyy")
Option Explicit
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Public Sub Main()
Debug.Print GetEngStr(Date)
End Sub
Private Function GetEngStr(d As Date) As String
Dim Buffer As String * 20, i As Long
i = GetLocaleInfo(&H409, &H43 + Month(d), Buffer, 20)
GetEngStr = LCase$(Left$(Buffer, i - 1)) & Format$(d, " dd yyyy")
End Function
Сейчас этот форум просматривают: Mail.ru [бот] и гости: 53