jQuery日期选择器Unix时间戳

20

我使用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

这个时间戳是以毫秒为单位的,所以如果我要进行转换,需要除以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。

这也是使用日期选择器中的ticks(!)获得的。


也许是因为夏令时/冬令时或客户端所在的另一个时区?如果这里有1秒钟的错误,当您将其设置为00:00:00时,就会向后跳一天。 - Keenora Fluffball
new DateTime(1, 1, 1, 0, 0, timestamp) 是否能给出正确的日期? - Blazemonger
我尝试使用new DateTime(1970, 1, 1),但是它没有成功,我得到了1970年的一年。 - amernov
这正是我所需要的,谢谢!var ts = Math.round((new Date().getTime() / 1000)); - Phill Pafford
我不建议在JavaScript和服务器代码之间传递双精度浮点数并将转换拆分。 - Robert Paulson
显示剩余2条评论
4个回答

4

很明显这是一个时区问题。

getTime()
该函数返回自“纪元”以来的毫秒数,意味着您会得到从本地计算机看到的Unix时间戳*1000。 请参见如果javascript“(new Date())。getTime()”在2个不同的时区中运行

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

因此,在我的电脑上,我得到了两个小时的差异。 我想不出一个简单的解决方法,但您可以尝试以下操作: datetimepicker getDate返回UTC格式的日期/时间


0

往返精度

Unix时间(自1970年1月1日以来的毫秒数)比.Net DateTime不够精确,因此在往返转换到.Net代码或与.Net DateTime进行比较时,应该期望这种精度。例如,.Net-> Unix-> .Net可能会有这么多的偏差。

var unixEpochPrecision = new TimeSpan(TimeSpan.TicksPerMillisecond);

这可能并不重要,但你至少应该意识到它。

转换为Unix纪元毫秒

当你开始时,需要使用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);

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日对应的Unix时间值大于零或一。因此,更正确的做法是将时间戳设置(而不是添加)到Datetime对象中(如果您有一个setter)。

0

很可能.NET不知道它所在的时区。您需要定义它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接