Date Time Picker - есть вопрос

Тема в разделе "MS Visual C++", создана пользователем Guest, 8 авг 2003.

Статус темы:
Закрыта.
  1. Guest

    Guest Гость

    Есть диалог на нем Date Time Picker и есть соответствующая ему переменная m_Time типа CTime. Проблема в том, что если m_Time = 0, то в диалоге высвечивается 2:00:00 !!?? Т.е. сдвиг на два часа. Причем если выставить 0:00:00, то будет "Assertion fault". Ну и соответственно, если установить 2:00:00, то после UpdateData() m_Time станет = 0. Скорее всего это как-то связано с часовым поясом (у меня часовой пояс +02:00). Как от этого избавиться?
     
  2. Guest

    Guest Гость

    Как известно, класс CTime - это всего лишь объектная обёртка вокруг типа time_t из стандартной библиотеки языка C. А тип time_t (4 байта) хранит время как число секунд, прошедших с момента полуночи 1 января 1970 года. Это означает, что класс CTime не может хранить время ДО этого момента. А если записать в него 0, мы как раз и получим 1.01.1970, 0:00:00 (или 2:00:00 с учётом часового пояса).
    Когда Date Time Picker работает в режиме ввода времени, он всё равно "помнит" полную дату. Если ввести в него "0:00:00", то с учётом часового пояса получится 31.12.1969, 22:00:00, то есть дата за пределами диапазона допустимых значений CTime. Это и приводит к срабатыванию ASSERT'а.
    А для решения проблемы достаточно записать в CTime какую-нибудь дату, отличную от 1.01.1970. Например:
    m_Time = CTime(2000, 1, 1, 0, 0, 0); // 1 января 2000 года
     
  3. Guest

    Guest Гость

    Суть "проблемы" в том, что элемент управления CDateTimeCtrl инкапсулирует одновременно и дату, и время , а не то или другое по отдельности. Как известно, тип данных time_t и класс CTime используют так называемый "UTC-based time" формат и хранят число секунд с ноля часов 1 января 1970 года (с учетом часового пояса). Поэтому при работе с CDateTimeCtrl это следует учитывать и использовать его именно в этом контексте (в "увязке" с датой). То есть, если мы инициируем переменную нулевым значением, то мы и имеем "точку отсчета".
    Другой интересный вопрос состоит в том, как эффективно организовать корректировку даты и времени одновременно. К примеру: мы имеем переменную m_Time типа CTime с некоторым значением и хотим дать пользователю возможность изменить и время и дату, используя соответственно два элемента CDateTimeCtrl, чтобы в конечном итоге получить скорректированное значение m_Time. Вариант с созданием двух ассоциированных переменных CTime и последующим отбрасыванием у одной даты, у другой времени, и их сложением не очень красивый. Я решил это таким образом: создал ассоциированные переменные типа CDateTimeCtrl (а не CTime), использовал функцию SetTime(&m_Time) для установки даты и времени в обоих переменных, а потом при изменении любой из них считывал измененное значение функцией GetTime(&m_Time) и тут же корректировал значение "сопряженной" переменной функцией SetTime(&m_Time). Таким образом достаточно просто решилась проблема "синхронизации" изменения даты и времени.
     
Загрузка...
Похожие Темы - Date Time Picker
  1. Amfion
    Ответов:
    6
    Просмотров:
    745
  2. Kozolick
    Ответов:
    0
    Просмотров:
    148
  3. EugenOS
    Ответов:
    2
    Просмотров:
    697
  4. garrick
    Ответов:
    12
    Просмотров:
    2.725
  5. vvlad
    Ответов:
    9
    Просмотров:
    2.280
Статус темы:
Закрыта.

Поделиться этой страницей