Способы преобразования времени Unix / Linux во время Windows - PullRequest
3 голосов
/ 25 марта 2011

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

Мне бы хотелось, чтобы Python, Excel, OpenOffice Calc пути, пути доступа, способы командной строки.Любой другой способ сделать это было бы неплохо.Переход на другой путь (от Windows к Linux) также был бы неплохим

У меня есть вывод из некоторых моих сценариев, которые включают время в секундах с 1970 года, но я хочу преобразовать во время Windows.Так что, когда он импортируется в базу данных, он не портит время.

В Linux вы можете получить время в микросекундах (10 ^ -6 секунд) с 1 января 1970 года, используя gettimeofday.

В Windows Содержит 64-разрядное значение, представляющее число интервалов в 100 наносекунд с 1 января 1601 года (UTC).

Вот способ C. Преобразование времени Unix / Linux в Windows. FILETIME

Пример выхода из поиска

find ./sd-mmc-card/ -iname *.jpg -printf "%h/%f\t%f\t%a\t%Ax\t%AT\t%A@\n" > dbtime.txt

./sd-mmc-card/0117.jpg    0117.jpg    Thu Mar 24 15:27:25.0059226867 2011    24/03/2011    15:27:25.0592268670    1300973245.0592268670

Ответы [ 5 ]

9 голосов
/ 25 марта 2011

Это описано в Преобразование значения time_t в время файла , которое предоставляет пример кода C.

Сводка:

filetime = (unixtime * 10000000) + 116444736000000000

0x3DE43B0C → 0x01C295C4:91150E00 (2002-11-27 03:25:00 +0000)

(также полезно Как распознать различные типы временных отметок с довольно большого расстояния .)


Зачастую легче разобрать удобочитаемую временную метку, например, "2002-11-27 03: 25: 00 "(printf %AF %AT), используя strptime() или аналогичный.

1 голос
/ 27 февраля 2015
BOOL PbyteTimeToUnixTime(PBYTE pTime, LONGLONG *pUnixTime)
{
    SYSTEMTIME  stSystemTime;
    FILETIME    stFileTime;

    //CONVERT SYSTEMTIME 
    memset(&stSystemTime, 0, sizeof(stSystemTime));
    stSystemTime.wYear      = ((pTime[0] << 8) + pTime[1]);
    stSystemTime.wMonth     = pTime[2];
    stSystemTime.wDay       = pTime[3];
    stSystemTime.wHour      = pTime[4];
    stSystemTime.wMinute    = pTime[5];
    stSystemTime.wSecond    = pTime[6];

    // SYSTEMTIME -> FILETIME 変換
    if (SystemTimeToFileTime(&stSystemTime, &stFileTime) == FALSE) {
        return FALSE;
    }

    // FILETIME -> UNIXTIME
    *pUnixTime  = stFileTime.dwHighDateTime;
    *pUnixTime  <<= 32;
    *pUnixTime  += stFileTime.dwLowDateTime;
    *pUnixTime  -= 116444736000000000;
    *pUnixTime  /= 10000000;
    *pUnixTime  -= 32400;           // JST -> GMT 

    return TRUE;
}
1 голос
/ 20 августа 2011

Я искал что-то подобное (преобразование между Windows и Linux времен / эпох) и закончил тем, что записывал что-то, используя кусочки из MSDN и Преобразование времени Unix / Linux в Windows FILETIME .

Это наивно реплицирует gettimeofday() из Linux с использованием Win32.

#include <windows.h>
/**
 * number of seconds from 1 Jan. 1601 00:00 to 1 Jan 1970 00:00 UTC
 */
#define EPOCH_DIFF 11644473600LL

void gettimeofday(ULARGE_INTEGER* microsecondsAsULINT)
    {
        FILETIME ftTime;
        SYSTEMTIME stTime;

        // Get the current system time
        GetSystemTime(&stTime);
        // Convert it to filetime which is # of 100ns periods since Jan 1, 1601
        SystemTimeToFileTime(&stTime, &ftTime);
        // Move it into the return result
        microsecondsAsULINT->HighPart = ftTime.dwHighDateTime;
        microsecondsAsULINT->LowPart = ftTime.dwLowDateTime;
        // Convert to UTC by subtracting epoch difference as 100ns periods
        microsecondsAsULINT->QuadPart -= (EPOCH_DIFF*10000000);
        // Convert to microseconds ([# of 100ns periods]/10 = [# of 1us periods])
        microsecondsAsULINT->QuadPart = microsecondsAsULINT->QuadPart/10;
    }

РЕДАКТИРОВАТЬ : пара встроенных комментариев были неясны во втором чтении; обновлено (также на ум добавляется умляут в 'i').

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

В офисе вы можете конвертировать с этим fomrulae, который я получил из открытого офиса fourms.открытый офис http://user.services.openoffice.org/en/forum/viewtopic.php?f=13&t=606#p2484

(время Unix / 86400) + 25569 = ваша дата

Take (время Unix 1300973245.0592268670 / по секундам в день (86400)) +25569 (дни с 1899 г.) = (40626.5607) 2011/03/24 13: 27: 24

Дата открытия офиса легко определить, поместив 0 в столбец и отформатировав его до даты.

0 = 1899/12/30 00: 00: 00
25569 = 1970/01/01 00:00:00 # количество дней с 1899 по 1970
40626.5607 = 2011/ 03/24 13:27:24

Я ожидал, что это будет то же самое в офисе 2007, но

0 = 1900/01/00 00: 00
365 = 1900/12/30 00: 00
25569 = 1970/01/01 00:00 # то же самое

Я не знаю, почему дата 0 отличаетсяв открытом офисе по сравнению с окнами.Теперь единственная проблема состоит в том, что время, которое оно сообщает, на 2 года моложе.Затем фактическая дата создания файлов.Должно быть сказано 2009, а не 2011.

Эта проблема связана с тем, что вместо команды «Дата создания» в моей команде поиска используется дата получения.

find ./sd-mmc-card/ -iname * .jpg -printf "% h /% f \ t% f \ t% a \ t% Ax \ t% AT \ t%A @ \ n "

это должно быть% t, а% T @ the \ t - вкладки.

find ./sd-mmc-card/ -iname * .jpg -printf "% h /% f \ t% f \ t% t \ t% T @ \ n"

По какой-то причине приведенная выше формула выпадает через два часа после создания.

Пт 27 марта 17: 08: 18.0000000000 2009 |2009/03/27 15:08:18

Так что я просто добавляю 0,08333 (2 часа) к формуле.

(Unix Time / 86400) + 25569 + 0,08333 = ваша дата

0 голосов
/ 20 февраля 2017

в Linux вы можете сделать следующее,

метка времени Unix в секундах

date -d @1267619929  
Wed Mar  3 14:38:49 SAST 2010

Строка даты с меткой unixtime.

date -d 2016-08-09 +%s  
1470693600

Взято из https://stackoverflow.com/a/2371288/619760

Затем примените математику из других сообщений, чтобы получить значение даты, которое распознается в MS office

echo $(( $(date -d '2016-08-08T00:00:00-0000' +%s) / 86400 + 25569 ))  
42590  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...