Преобразование строки, содержащей localtime в UTC в C

На самом деле, непосредственно перед тем, как FF3 отсутствовал, я сделал некоторые эксперименты, и FF2 отправляет только имя файла, как сделал Opera 9.0. Только IE отправляет полный путь. Поведение имеет смысл, потому что сервер не должен знать, где пользователь хранит файл на своем компьютере, это не важно процессу загрузки. Если Вы не пишете приложение интранет и получаете файл прямым доступом к сети!

то, Что изменилось (и это - основное назначение объекта ошибки, на который Вы указываете на), - то, что FF3 больше не позволяют доступу к пути к файлу от JavaScript. И не позволит, вводят/вставляют путь там, который является более раздражающим для меня: у Меня есть расширение оболочки, которое копирует путь файла от Windows Explorer до буфера обмена, и я использовал его много в такой форме. Я решил проблему при помощи расширения DragDropUpload. Но это становится вне темы, я боюсь.

интересно, что Ваши Веб-формы делают, чтобы прекратить работать с этим новым поведением.

[РЕДАКТИРОВАНИЕ] После того, чтобы читать страницу, связанную Mike, я вижу действительно, использование интранет пути (определите, что пользователь, например) и локальное использование (показывают предварительный просмотр изображения, локальное управление файлами). Пользовательский Затор-es, кажется, предоставляет обходному решению nsIDOMFile (не попробованный все же).

5
задан codebox 19 November 2009 в 17:38
поделиться

3 ответа

Думаю, теперь я его взломал, благодаря Andomar - этот код делает то, что мне нужно, и, похоже, работает независимо от текущего статуса летнего времени (я изменил часы на своем ПК, чтобы проверить это):

#include <time.h>
#include <assert.h>

time_t parseLocalDate(char* date){
    struct tm cal = {0, 0, 0, 0, 0, 0, 0, 0, -1, 0, NULL};
    strptime(date, "%Y/%m/%d/%H", &cal);
    return mktime(&cal);
}

int main(int argc, char *argv[]){
 // DST is effect, Local Time = GMT+1
    assert(1251759600 == parseLocalDate("2009/09/01/00")); // Mon, 31 Aug 2009 23:00:00 GMT
    assert(1254351600 == parseLocalDate("2009/10/01/00")); // Wed, 30 Sep 2009 23:00:00 GMT
 // DST not in effect, Local Time = GMT
    assert(1257033600 == parseLocalDate("2009/11/01/00")); // Sun, 01 Nov 2009 00:00:00 GMT
}
0
ответ дан 14 December 2019 в 19:17
поделиться

Вы можете использовать mktime для интерпретации структуры tm в местном часовом поясе. При этом не забудьте установить флаг tm_isdst . Это 0 для лета, 1 для зимы и -1, чтобы mktime это вычислили. Вот пример кода:

void main()
{
    char* date = "2009/09/01/00";
    struct tm cal = {};
    // Read string into struct tm
    strptime(date, "%Y/%m/%d/%H", &cal);
    // Tell mktime to figure out the daylight saving time
    cal.tm_isdst = -1;
    printf("%20s: %s", "Before mktime", asctime(&cal));
    // Convert struct tm to time_t
    time_t t = mktime(&cal);
    // Convert time_t to localtime
    struct tm localcal = *localtime(&t);
    printf("%20s: %s", "Local time", asctime(&localcal));
    printf("%20s: %i\n", "Local DST", localcal.tm_isdst);
    // Convert time_t to GMT
    struct tm gmcal = *gmtime(&t);
    printf("%20s: %s", "GM time", asctime(&gmcal));
    printf("%20s: %i\n", "GM DST", gmcal.tm_isdst);
}

Это печатает (я живу в GMT + 1, а сейчас зима):

   Before mktime: Tue Sep  1 00:00:00 2009
      Local time: Tue Sep  1 00:00:00 2009
       Local DST: 1
         GM time: Mon Aug 31 22:00:00 2009
          GM DST: 0

Похоже, mktime преобразует дату в сентябре на основе текущего летнего времени. Сейчас ноябрь, так что на самом деле один час выходной. Я не нашел способа исправить это.

5
ответ дан 14 December 2019 в 19:17
поделиться

Вот моя версия, использующая tm_gmtoff . Надеюсь, библиотека позаботится о переходе на летнее время ...

#define _BSD_SOURCE
#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>

int gmtoffset(void) {
  struct tm *dummy;
  time_t t = 0;
  dummy = localtime(&t);
  return dummy->tm_gmtoff; /* _BSD_SOURCE */
}

int main(void) {
  int off;
  const char *date = "2009/09/01/00";
  struct tm cal = {0};
  time_t t;

  off = gmtoffset();

  strptime(date, "%Y/%m/%d/%H", &cal); /* _XOPEN_SOURCE */
  t = mktime(&cal);
  printf("t     --> %s", ctime(&t)); /* ctime includes a final '\n' */
  t -= off;
  printf("t-off --> %s", ctime(&t));
  return 0;
}
$ /usr/bin/gcc ptime.c
$ ./a.out
t     --> Tue Sep  1 01:00:00 2009
t-off --> Tue Sep  1 00:00:00 2009
0
ответ дан 14 December 2019 в 19:17
поделиться
Другие вопросы по тегам:

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