Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с форматом даты. Как определить формат даты на машине?

266
20 января 2004 года
mhaturov
901 / / 23.10.2003
Недавно писал пост по поводу ошибки, возникающей на отдельно взятой машине.
Выяснилось, что на ней в RegionalOptions в закладке Date установлен короткий формат даты как dd/mm/yyy с разделителем "/".
Проблема в следующем. У меня есть свой собственный контрол. На нём есть календарь (DateTimePicker). У него установлен формат отображения даты в виде "dd:mm:yyyy". Ему передаётся дата в виде выражения Format(<Дата>,"dd:mm:yyyy"), так как, если передавать по-другому, почему-то на некоторых машинах она отображается по-другому, чем вводит пользователей в заблуждение.
Так вот, при передаче даты в таком виде, программа на проблемной машине валилась с ошибкой Invalid procedure call or argument.
Тут такая дилема: на всех машинах, кроме этой, пользователи хотят видеть дату в формате "dd:mm:yyyy". На этой "попрёт" "dd/mm/yyyy" (так именно она отображается при передаче без конвертирования). К тому же на этой машине НЕЛЬЗЯ сменить формат даты, так как он критичен для программы стороннего разработчика.
Сейчас я ввёл условную компиляцию, при которой для этой машины компилируется отдельная версия моей проги, но хочется не париться дальше с этим, и как-то "на лету" определять тип даты, установленной на машине именно в указанной выше опции (не путать с датой в опции Date/Time - меня интересует именно Regional Options)?
478
20 января 2004 года
XtreamAll
279 / / 01.10.2003
Как то Cutty Sark мне подсказал насчет системных разделителей (целой и дробной части):

Application.International(xlDecimalSeparator)

Я думаю, может здеся можно поискать ответ и на твой вопрос (може есть подходящая константа)...
...шота типа xlDateFormat..
266
20 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
Как то Cutty Sark мне подсказал насчет системных разделителей (целой и дробной части):

Application.International(xlDecimalSeparator)

Я думаю, может здеся можно поискать ответ и на твой вопрос (може есть подходящая константа)...
...шота типа xlDateFormat..


Чёй-то не могу найти ничего...:{

267
21 января 2004 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by mhaturov

Чёй-то не могу найти ничего...:{



Application.International(...)
xlDateSeparator
xlDateOrder
xlMonthNameChars
xlMDY
xlMonthLeadingZero

но это все в Экселе. Как в ВБ - не знаю.

478
21 января 2004 года
XtreamAll
279 / / 01.10.2003
По-моему в Ёкселе нету своего формата даты (могу ошибаться) и он юзает системный...
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
По-моему в Ёкселе нету своего формата даты (могу ошибаться) и он юзает системный...


Дык мне системный нужен...:{ Я уже запарился "колдовать", делать горы разных версий екзешников и жертвовать универсальностью. Эта же проблема должна просто очень решаться как-то! Только как?...:x

478
21 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by mhaturov

Дык мне системный нужен...:{ Я уже запарился "колдовать", делать горы разных версий екзешников и жертвовать универсальностью. Эта же проблема должна просто очень решаться как-то! Только как?...:x



А это:

 
Код:
Declare Function GetDateFormat Lib "kernel32.dll" Alias "GetDateFormatA" ( _
     ByVal Locale As Long, _
     ByVal dwFlags As Long, _
     lpDate As SYSTEMTIME, _
     ByVal lpFormat As String, _
     ByVal lpDateStr As String, _
     ByVal cchDate As Long) As Long

не подойдет???
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll


А это:

 
Код:
Declare Function GetDateFormat Lib "kernel32.dll" Alias "GetDateFormatA" ( _
     ByVal Locale As Long, _
     ByVal dwFlags As Long, _
     lpDate As SYSTEMTIME, _
     ByVal lpFormat As String, _
     ByVal lpDateStr As String, _
     ByVal cchDate As Long) As Long

не подойдет???


Спасибо огромное!
Сегодня попробую!:) :) :)

478
21 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by mhaturov

Спасибо огромное!
Сегодня попробую!:) :) :)



http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html

478
21 января 2004 года
XtreamAll
279 / / 01.10.2003
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html

ошибочка вышла;)
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Цитата:
Originally posted by XtreamAll
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html

ошибочка вышла;)


Большое спасибо!

478
21 января 2004 года
XtreamAll
279 / / 01.10.2003
Цитата:
Originally posted by mhaturov

Большое спасибо!



Незашто;)
...просто вспомнил, что ты как-то интересовался API Viewer-ом...

258
21 января 2004 года
SergeySV
1.5K / / 19.03.2003
Через API, пример получения короткого формата даты:

Код:
' в модуль
Option Explicit

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

Public Const LOCALE_SYSTEM_DEFAULT = &H400
Public Const LOCALE_USER_DEFAULT = &H800

Public Const LOCALE_SSHORTDATE As Long = &H1F
Public Const LOCALE_STIMEFORMAT As Long = &H1003


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
Private Declare Function GetDateFormat Lib "kernel32" Alias "GetDateFormatA" (ByVal Locale As Long, ByVal dwFlags As Long, lpDate As SYSTEMTIME, ByVal lpFormat As String, ByVal lpDateStr As String, ByVal cchDate As Long) As Long

Public Sub DataLocal()
    ' 1 способ
    Dim lBuffSize As String
    Dim sBuffer As String
    Dim lRet As Long
    Dim sDateFormat As String
   
    lBuffSize = 256
    sBuffer = String$(lBuffSize, vbNullChar)
    lRet = GetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, sBuffer, lBuffSize)
    If lRet > 0 Then
       sDateFormat = Left$(sBuffer, lRet - 1)
       MsgBox sDateFormat
    End If
   
    ' 2 способ
    Dim Buffer As String, ST As SYSTEMTIME
    With ST
        .wDay = 6
        .wMonth = 8
        .wYear = 2000
    End With
    Buffer = String(255, 0)
    GetDateFormat LOCALE_SYSTEM_DEFAULT, 0, ST, vbNullString, Buffer, Len(Buffer)
    Buffer = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
    MsgBox Buffer

End Sub


В первом способе получаем формат даты в виде "dd/mm/yyyy", а во втором свою дату форматируем под образец региональных установок.
Во втором способе, по параметру vbNullString он понимает что надо использовать локальные установки даты, но можно и свой задать, а также например, то что получили в первом способе (т.е. пер. sDateFormat)
258
21 января 2004 года
SergeySV
1.5K / / 19.03.2003
XtreamAll ;)
266
21 января 2004 года
mhaturov
901 / / 23.10.2003
Большое спасибо!:) :) :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог