Полночь в часовом поясе UTC с отметкой времени Unix - PullRequest
3 голосов
/ 17 июня 2009

Я искал числовое представление для даты, и время unix для полуночи (в UTC) кажется разумным выбором для этого. Однако, как я не уверен в своих математических навыках, так и

date = date - date % (24 * 60 * 60);

где date - это метка времени Unix, как это сделать? Есть ли более простой метод?

Ответы [ 3 ]

5 голосов
/ 17 июня 2009

Да, ваша формула - отличный способ сделать это. Еще один способ сделать то же самое:

date = (date / 86400) * 86400;

Возможно, стоит отметить, что приведенная выше формула предполагает целочисленное (усеченное) деление. Кроме того, я чувствую, что 86400 является достаточно часто используемой константой, поэтому она может появляться в исходном коде без дополнительных комментариев.

1 голос
/ 17 июня 2009

Желаемый язык / библиотеки?

Я предполагаю C со стандартными библиотеками UNIX.

time.h идеально подойдет.

#include <time.h>

struct tm date_tm;
time_t date;

localtime_r(NULL, &date_tm);
date_tm.tm_sec = 0;
date_tm.tm_min = 0;
date_tm.tm_hour = 0;

date = mktime(&date_tm);

Полагаю, что обходной метод to-string / from-string тоже подойдет, но я бы его не рекомендовал. (%F и %Z должны требоваться C99 и / или некоторыми спецификациями POSIX или SUS.)

#define DATE_FORMAT "%F %Z"  /* yyyy-mm-dd t-z */

char date_str[15];
struct tm date_tm;
time_t date;

localtime_r(NULL, &date_tm);
strftime(date_str, sizeof(date_str), DATE_FORMAT, &date_tm);
strptime(date_str, DATE_FORMAT, &date_tm);

date = mktime(&date_tm);

Хм, сначала я не заметил, что вы хотите UTC. Поскольку один день UNIX гарантированно всегда будет 86400 секунд UNIX во времени UNIX, я не вижу никаких проблем с вашим исходным решением.

0 голосов
/ 17 июня 2009

Просто используйте strtotime без доли времени.

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