powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / КАК РАБОТАЕТ CDate() в Visual Basic 6
2 сообщений из 2, страница 1 из 1
КАК РАБОТАЕТ CDate() в Visual Basic 6
    #32641925
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция CDate() представляет собой вызов функции vbaDateStr из динамической библиотеки MSVBVM60.DLL. А она, в свою очередь, опирается на функцию VarDateFromStr из oleaut32.dll, т.е. на функцию из системной библиотеки. Таким образом, остается исследовать работу VarDateFromStr на различных операционных системах и пакетах обновления (в данной заметке речь идет исключительно о Windows Server 2003, так как я на ней работаю – прошу дополнить для других систем, если есть информация).

Напишем небольшую тестовую программу для вызова VarDateFromStr :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <oleauto.h>

void MyCDate(WCHAR * dt)
{
	HRESULT hr;
	DATE dateOut;

	hr = VarDateFromStr(dt, GetUserDefaultLCID(),  0 , &dateOut);
    
	if(FAILED(hr))
		printf("FAILED!\n");
	else
		printf("%S converted to DATE\n", dt);
}

int main(int argc, char * argv[])
{
	MyCDate(L"12-31-2004");

	MyCDate(L"31-12-2004");

	return  0 ;
}
Результаты работы поразительны:

Код: plaintext
1.
 12 - 31 - 2004  converted to DATE
 31 - 12 - 2004  converted to DATE

То есть, функция VarDateFromStr умна настолько, что переставляет местами цифры, если не может произвести преобразование. За такой подход разработчика VarDateFromStr надо сажать в клетку и кормить сырым мясом.

Единственное, что мы можем сделать - определить формат даты, который будет использован в самый первый "заход". Вот как это можно сделать:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <oleauto.h>

int main(int argc, char * argv[])
{
	int result;
	WCHAR DateStr[ 20 ];
	LCID lcid;

	lcid = GetUserDefaultLCID();

	result = GetDateFormat(lcid,  0 , NULL, NULL, (LPTSTR)&DateStr, sizeof(DateStr));
	if(!result)
	{
		printf("GetDateFormat() failed, %d\n", GetLastError());
		return - 1 ;
	}

	printf("lcid=%d, format=%s\n", lcid, DateStr);

	return  0 ;
}

Результаты:

Код: plaintext
lcid= 1049 , format= 10 . 08 . 2004 

Задав явно LCID , можно определить, что есть такие форматы:

Код: plaintext
1.
lcid= 2057 , format= 10 / 08 / 2004 	(это English U.K.)
lcid= 1033 , format= 8 / 10 / 2004 	(это English U.S.)

Т.е. десятое Августа в этих двух форматах представлено по-разному: в одном dd/mm/yyyy , в другом - m/dd/yyyy .
Таким образом, для того, чтобы функция VarDateFromStr работала верно, необходимо, чтобы GetUserDefaultLCID() возвращала "верный" LCID .

Опытным путем было установлено, что на результат GetUserDefaultLCID() можно повлиять таким образом (еще раз напомнб, что речь о системе Windows 2003 Server):

Control Panel->Regional and Language Options

В первой же вкладке выбираем требуемый стандарт (например, English (United States)) и, при необходимости, настраиваем детали (Customize Regional Options).

_____________
jimmers forever!
...
Рейтинг: 0 / 0
КАК РАБОТАЕТ CDate() в Visual Basic 6
    #32642070
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jimmersТо есть, функция VarDateFromStr умна настолько, что переставляет местами цифры, если не может произвести преобразование. За такой подход разработчика VarDateFromStr надо сажать в клетку и кормить сырым мясом.

я с тобой НЕ согласен!!! за такой подход этих ребят надо бы вообще разложить на облачко атомов, и размазать между 2-3 галактиками :-)

например, за последние 8 лет работы с VB и VBA у меня ни в одном проекте не встретишь CDate - только DateSerial.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / КАК РАБОТАЕТ CDate() в Visual Basic 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]