Метка времени jQuery Datepicker unix - PullRequest
20 голосов
/ 29 августа 2011

Я добавляю DatePicker с помощью JQuery DatePicker и использую altFormat '@' -> see http://docs.jquery.com/UI/Datepicker/formatDate

 // Function datepicker
        $("#obsDate").datepicker({
            altField: '#actualDate',
            altFormat: '@',        // Gives a timestamp dateformat
            dateFormat: "dd-mm-yy",
            showOn: "button",
            buttonImage: $("#datePickerImg").val(),
            buttonImageOnly: true,
        });

Когда пользователь выбирает значение, устанавливается метка времени Unix. Как: 1312840800000

Это в миллисекундах, поэтому я делаю / 1000

Но когда я конвертирую метку времени с функцией в C #

private static DateTime ConvertFromUnixTimestamp(double timestamp)
        {
            var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return origin.AddSeconds(timestamp);
        }

Я всегда на один день старее ..

Что я делаю не так?

ОБНОВЛЕНИЕ: Когда я использую встроенную функцию JavaScript gettime ()

var ts = Math.round((new Date().getTime() / 1000));

Я получаю правильную метку времени ...

  • Пример с getTime () я получаю: 30-08-2011 -> 1314628036

Пример с указателем даты, который я получаю: 29-08-2011 -> 1314568800.

Это также с галочками (!) В указателе даты.

Ответы [ 4 ]

4 голосов
/ 24 октября 2012

Это, очевидно, IS проблема часового пояса.

getTime()Эта функция возвращает миллисекунды с начала эпохи, то есть вы получаете Unix timestamp * 1000, как видно с локального компьютера.См. Если javascript «(new Date ()). GetTime ()» запущен из 2 разных часовых поясов .

datepicker({altFormat: '@'})Из того, что я вижу в библиотеке jQuery, datepicker внутренне использует функцию formatDate, которая учитывает часовой пояс (я начал здесь: jQuery.datepicker.formatDate и смещение часового пояса ...)

Итак, на моем ПК я получаю разницу в 2 часа.Я не могу придумать простой способ решить эту проблему, но вы можете попробовать следующее: datetimepicker getDate для возврата даты / времени в формате UTC

0 голосов
/ 10 октября 2013

Точность туда и обратно

Время Unix (миллисекунды с 1 января 1970 года) является менее точным, чем .Net DateTime, поэтому для кругового обращения к .Net-коду или по сравнению с .Net DateTime эту точность следует ожидать. Например. .Net -> Unix -> .Net может быть отключен на эту сумму.

var unixEpochPrecision = new TimeSpan(TimeSpan.TicksPerMillisecond);

Это может не иметь большого значения, но вы должны хотя бы знать об этом.

Конвертировать в Unix Epoch миллисекунды

Даты UTC требуются при запуске, иначе вы будете отключены на несколько часов. Это имеет смысл, потому что время Unix, независимо от часового пояса, всегда выражается в UTC. Если бы только .net был таким.

DateTime UnixEpochBaseDate = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

Int64 ToUnixTime(DateTime utcValue)
{
    if (utcValue.Kind != DateTimeKind.Utc)
        throw new ArgumentException("Value must be in Utc.");

    var result = (utcValue - UnixEpochBaseDate).Ticks / TimeSpan.TicksPerMillisecond;
    return result;
} 

Преобразование из эпохи Unix в CLR DateTime

Просто используйте миллисекунды как есть. Это также облегчает кодирование JavaScript.

DateTime ToClrDateTime(Int64 unixEpochMilliseconds)
{
    var clrDateTime = UnixEpochBaseDate + 
        new TimeSpan(unixEpochMilliseconds * TimeSpan.TicksPerMillisecond);
    return clrDateTime;
} 

В JavaScript

var date = new Date(1381367291665);
0 голосов
/ 30 сентября 2013

По отношению к вашему коду вы должны сделать следующее:

    private static DateTime ConvertFromUnixTimestamp(double timestamp)
    {
        var origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        return origin.AddSeconds(timestamp - origin.getTime());
    }

Это потому, что 1 января в большинстве часовых поясов соответствует значению unixtime, которое больше нуля или единицы.Итак, более правильно, вы должны установить (не добавлять) метку времени для объекта Datetime (если у вас есть установщик).

0 голосов
/ 29 августа 2011

Вполне вероятно, что .NET не знает, какой это часовой пояс.Вы должны будете определить это.

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