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.
Ответы
Ответ 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);