C - Как исправить добавление временного смещения, неправильный расчет

Это небольшое решение, которое работает во всех браузерах даже IE8:

var monitor = setInterval(function(){
    var elem = document.activeElement;
    if(elem && elem.tagName == 'IFRAME'){
        clearInterval(monitor);
        alert('clicked!');
    }
}, 100);

Вы можете проверить его здесь: http://jsfiddle.net/oqjgzsm0/

1
задан Jonathan Leffler 18 January 2019 в 03:15
поделиться

1 ответ

Тип time_t представляет Unix time , количество секунд с четверга, 1 января 1970 года, 00:00:00 UTC, минус високосные секунды.

(Интерфейс POSIX clock_gettime() может расширить поддержку для CLOCK_TAI, что будет то же самое, за исключением , включая високосных секунд.)

Для манипуляции датами , лучше использовать стандартное время разбивки C, struct tm, как предусмотрено в localtime() или gmtime() .

localtime() использует текущий часовой пояс. (В системах Linux часовой пояс по умолчанию установлен в /etc/timezone, но каждый пользователь может переопределить его, установив переменную окружения TZ. Подробнее о том, как это сделать, см. Функцию tzset() POSIX.1]. ) gmtime() использует UTC.

«Уловка» заключается в том, что если вы вызовете mktime() для struct tm, описывающего дату и время в текущем часовом поясе, он сначала нормализует поля, а затем возвращает время Unix как time_t, соответствующее этой дате и местному времени. Например, если день месяца равен 45, он будет корректировать день, месяц и год (и соответствующие поля) для отражения фактической даты.

Итак, если вы хотите узнать дату и время через пять дней и шесть часов:

    time_t     now, then;
    struct tm *t;

    now = time(NULL);
    t = localtime(&now);

    printf("Now is %llu = %04d-%02d-%02d %02d:%02d%02d\n",
           (unsigned long long)now,
           t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
           t->tm_hour, t->tm_min, t->tm_sec);

    t->tm_hour += 6;
    t->tm_mday += 5;
    t->tm_isdst = -1; /* Don't know if DST or not; please guess. */
    then = mktime(t);

    printf("Then is %llu = %04d-%02d-%02d %02d:%02d:%02d\n",
           (unsigned long long)then,
           t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
           t->tm_hour, t->tm_min, t->tm_sec);

Если мы опускаем печать значений now и then, вышеприведенное совершенно стандартный код C и будет работать на всех современных операционных системах.

Если вы используете Linux или другую систему POSIXy (Mac, BSD), было бы лучше использовать

    time_t     now, then;
    struct tm  tbuffer, *t;

    now = time(NULL);
    t = localtime_r(&now, &tbuffer);

    printf("Now is %llu = %04d-%02d-%02d %02d:%02d%02d\n",
           (unsigned long long)now,
           t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
           t->tm_hour, t->tm_min, t->tm_sec);

    t->tm_hour += 6;
    t->tm_mday += 5;
    t->tm_isdst = -1; /* Don't know if DST or not; please guess. */
    then = mktime(t);

    printf("Then is %llu = %04d-%02d-%02d %02d:%02d:%02d\n",
           (unsigned long long)then,
           t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
           t->tm_hour, t->tm_min, t->tm_sec);

Разница в том, что localtime() возвращает указатель на статически распределенный буфер, а другой обращение к нему (даже в другом потоке) перезапишет содержимое. POSIX.1 localtime_r() принимает второй параметр, указатель на struct tm, где вместо этого сохраняется результат.

0
ответ дан Nominal Animal 18 January 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: