Подтвердить что ты не робот

JQuery Datepicker unix timestamp

Я добавляю datepicker с jQuery datepicker и использую altFormat '@' → см. 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

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

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

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(): get: 30-08-2011 → 1314628036

Пример с datepicker я получаю: 29-08-2011 → 1314568800.

Это также с тиками (!) в datepicker.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

    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 (если у вас есть сеттер).

Ответ 4

Точность в минутах езды

Unix times (миллисекунды с 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 Epoch в CLR DateTime

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

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

В JavaScript

var date = new Date(1381367291665);