Определить DST флаг будущей даты в C - PullRequest
2 голосов
/ 13 марта 2011

У меня есть система, в которой мне предоставляют дату и время в виде строки, например «2011-03-13 03:05:00».Я могу получить эту строку в «2011-03-13 01:59:00», и мне нужно знать промежуток времени между текущим временем и временем в строке (6 минут из-за изменения летнего времени).

У меня есть код, который анализирует строку и создает tm структуру, которая затем преобразуется в time_t с mktime.Проблема в том, что мне нужно установить флаг tm_isdst вручную, когда я анализирую время, и поэтому я ищу способ определить, следует ли установить tm_isdst.Любые идеи?

У меня есть несколько идей о том, как справиться со случаем, когда есть 2, 2 часа ночи, которые были бы специфичны для моего приложения, но мне все еще нужен способ сказать: «Если на этот раз была текущая системавремя, DST будет в силе? "

Редактировать: Идея основана на предложении Пита.Что делать, если я:

  1. Проверьте, если полученное время и текущее системное время имеют разные часы:
  2. Если тот же час, но в прошлом, добавьте час к текущему времени и посмотрите, еслиФлаг DST изменен.(Если в тот же час и в будущем предполагается использовать тот же флаг DST, что и текущее время (это большая часть года))
  3. Если другой час, мы добавляем 1 час к текущему системному времени и видим, изменился ли флаг DST

Мысли?

Ответы [ 3 ]

5 голосов
/ 13 марта 2011

Согласно man mktime (на Linux, выделено мое):

Значение, указанное в tm_isdst поле сообщает mktime (), действительно ли летнее время (DST) в эффект за время, указанное в тм структура: положительное значение означает DST действует; ноль означает, что DST не в силе; и отрицательное значение означает, что mktime () должен (использовать информация о часовых поясах и система базы данных, чтобы) попытаться определить действует ли DST на указанное время .

Вы пробовали это?

(Это «попытка определить», потому что некоторые моменты в корне неоднозначны.)

Что-то, что вы могли бы попробовать в действительно неоднозначные времена, это посмотреть, исправляет ли mktime ваш флаг dst или нет. Держу пари, что это непереносимо. Пример кода, переход установлен 31/10/2010, в 3 часа откатится до 2 часов в моем часовом поясе (Европа / Париж):

#include <time.h>
#include <stdio.h>
#include <string.h>

void printit(int hour, int isdst)
{
    struct tm when;
    memset(&when, 0, sizeof(when));
    when.tm_sec = 0;
    when.tm_min = 30;
    when.tm_hour = hour;
    when.tm_mday = 31;
    when.tm_mon = 9;
    when.tm_year = 110;
    when.tm_isdst = isdst;
    time_t secs = mktime(&when);
    fprintf(stdout, "%2d %ld %d %s", isdst, secs, when.tm_isdst, asctime(&when));
}

int main(int argc, char **argv)
{
    for (int i=1; i<4; i++) {
        fprintf(stdout, "At %dam\n", i);
        printit(i, 1);
            printit(i, 0);
        printit(i, -1);
    }
}

Вывод:

At 1am
 1 1288481400 1 Sun Oct 31 01:30:00 2010
 0 1288485000 1 Sun Oct 31 02:30:00 2010
-1 1288481400 1 Sun Oct 31 01:30:00 2010
At 2am
 1 1288485000 1 Sun Oct 31 02:30:00 2010
 0 1288488600 0 Sun Oct 31 02:30:00 2010
-1 1288488600 0 Sun Oct 31 02:30:00 2010
At 3am
 1 1288488600 0 Sun Oct 31 02:30:00 2010
 0 1288492200 0 Sun Oct 31 03:30:00 2010
-1 1288492200 0 Sun Oct 31 03:30:00 2010

Как видите, когда время не однозначно, mktime исправляет его, устанавливая правильное значение tm_isdst и смещая время. Когда оно равно неоднозначно, tm_isdst не изменяется.

1 голос
/ 13 марта 2011

Всегда рассчитывай на меня в грубой силе.Это может сработать:

  1. полностью проанализировать строку времени и поместить ее в структуру tm
  2. вызвать mktime (), чтобы получить значение time_t для этой структуры tm
  3. добавьте 6 минут к этому новому значению time_t (используя какое значение для 6 минут?)
  4. вызовите asctime () или подобное, чтобы получить структуру tm (т. е. "разбитое время") из этого значения time_t
  5. в этой структуре tm, которую вы только что вернули из asctime (), что говорит вам tm_isdst?

- Пит

Да, вы правы: всеБеспорядок вокруг времени очень плохо (даже злонамеренно, как иногда считают) предназначен для того, чтобы сбить с толку программистов и предоставить идеальные вопросы о закрытых книгах для ваших ленивых / педантичных / идиотических инструкторов по CS.

0 голосов
/ 13 сентября 2012

У меня такой же вопрос, как и у вас, я не знаю, сможет ли это решение это исправить?

struct tm *local_tm;
time_t t;
t = time(NULL);
local_tm = localtime(&t);
local_tm->tm_year = 2012-1900;
local_tm->tm_mon = 9 - 1;
local_tm->tm_mday = 13;
time_t utc_time = mktime(local_tm);

Я думаю, что если вы получите tm из системы, поле tm_isdst уже установлено,поэтому осталось изменить другие поля, кроме tm_isdst, я не уверен, правильно ли это, но я попробую, если это сработает, я дам дальнейшую обратную связь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...