Преобразование между часовыми поясами в C

Объекты в булевом контексте

Пустые кортежи, списки, dicts, строки и много других объектов эквивалентны Лжи в булевом контексте (и непустой эквивалентны Истинному).

empty_tuple = ()
empty_list = []
empty_dict = {}
empty_string = ''
empty_set = set()
if empty_tuple or empty_list or empty_dict or empty_string or empty_set:
  print 'Never happens!'

Это позволяет логическим операциям возвращать один из, его - операнды вместо Истинного/ложного, который полезен в некоторых ситуациях:

s = t or "Default value" # s will be assigned "Default value"
                         # if t is false/empty/none
6
задан verma 23 July 2009 в 18:19
поделиться

3 ответа

Поскольку комментарии не позволяют размещать код, отправляя их как отдельный ответ .. Если вы знаете "местное" время и время "UTC", вы можете рассчитать смещение "другого" времени по вашему "местному" времени. Затем вы конвертируете struct tm в календарное время, добавляете желаемое количество секунд (являющееся смещением целевого времени) и конвертируете его обратно в struct tm:

(отредактировано для учета другого сценария использования нормализации mktime)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>

int main(int argc, char *argv) {
  struct timeval tv_utc;
  struct tm *local_tm, *other_tm;

  /* 'synthetic' time_t to convert to struct tm for the other time */
  time_t other_t_synt;
  /* Other time is 1 hour ahead of local time */
  int other_local_delta = 1*3600; 


  /* the below two lines are just to set local_tm to something */
  gettimeofday(&tv_utc, NULL);
  local_tm = localtime(&tv_utc.tv_sec);

  printf("Local time: %s", asctime(local_tm));

  #ifdef DO_NOT_WRITE_TO_LOCAL_TM
  other_t_synt = mktime(local_tm) + other_local_delta;
  #else
  local_tm->tm_sec += other_local_delta;
  /* mktime will normalize the seconds to a correct calendar date */
  other_t_synt = mktime(local_tm);
  #endif

  other_tm = localtime(&other_t_synt);

  printf("Other time: %s", asctime(other_tm));

  exit(0);
}
5
ответ дан 17 December 2019 в 00:12
поделиться

Вы можете использовать gmtime () и структуру tm, чтобы напрямую установить это, при условии, что вам известны смещения.

Если вы знаете свое местное время и UTC, вы знаете свое местное смещение. Если вы также знаете целевое смещение, это просто вопрос установки соответствующего tm_hour (и, возможно, переключения дня, если вы выберете <0 или> 23).

Пример кода см. В справочнике gmtime страница . Он показывает смещение на основе смещения часового пояса.


Edit:

В ответ на комментарии - вы также можете позволить mktime обрабатывать смещение за вас, что позволяет вам упростить это путем преобразования обратно в time_t. Вы можете использовать что-то вроде:

time_t currentTime;
tm * ptm;
time ( &currentTime );
ptm = gmtime ( &rawtime );
ptm->tm_hour += hours_to_shift;
ptm->tm_minutes += minutes_to_shift; // Handle .5 hr timezones this way

time_t shiftedTime = mktime( ptm );
// If you want to go back to a tm structure:

tm * pShiftedTm = gmtime( &shiftedTime );
2
ответ дан 17 December 2019 в 00:12
поделиться

По всей вероятности, ваша операционная система предоставляет некоторую поддержку для этого.

В операционных системах, производных от UNIX, вы можете просмотреть страницы руководства для asctime, asctime_r, ctime, ctime_r , difftime, gmtime, gmtime_r, localtime, localtime_r, mktime, timegm .

0
ответ дан 17 December 2019 в 00:12
поделиться
Другие вопросы по тегам:

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