jQuery Datepicker unix时间戳

时间:2011-08-29 13:42:36

标签: javascript jquery datepicker

我使用jQuery datepicker添加一个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

这是几百万秒,所以我想做/ 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

我得到的datepicker示例: 29-08-2011 - > 1314568800。

这也是在datepicker中使用ticks(!)。

4 个答案:

答案 0 :(得分:4)

这显然是 IS 时区问题。

getTime()
此函数返回自' epoch'以来的毫秒数,这意味着从本地计算机可以看到Unix timestamp * 1000。 请参阅If javascript “(new Date()).getTime()” is run from 2 different Timezones

datepicker({altFormat: '@'})
从我在jQuery库中看到的内容,datepicker内部使用formatDate函数,将时区考虑在内 (我从这里开始:jQuery.datepicker.formatDate and timezone offset ...)

所以,在我的电脑上我有2个小时的差异。 我无法想出解决此问题的简单方法,但您可以尝试以下方法: datetimepicker getDate to return Date / Time in UTC format

答案 1 :(得分:0)

.NET很可能不知道它是什么时区。你必须定义它。

答案 2 :(得分:0)

关于你的代码,你必须做下一步:

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

这是因为大多数时区的1月1日对应于大于零或一的unixtime值。因此,更准确地说,您必须设置(不添加)Datetime对象的时间戳(如果您有一个setter)。

答案 3 :(得分:0)

往返精度

Unix时间(自1970年1月1日以来的毫秒数)不如.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);