【问题标题】:jQuery Datepicker unix timestampjQuery Datepicker unix 时间戳
【发布时间】:2011-11-06 01:17:53
【问题描述】:

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

这是以毫秒为单位,所以我 id do /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.

日期选择器中的记号 (!) 也是如此。

【问题讨论】:

  • 你试过new DateTime(1970, 1, 1);吗?
  • 你的第二个代码 sn-p 是什么语言?
  • 可能是因为 sumemr/wintertime 或客户的其他时区?当您将其设置为 00:00:00 时,在这里错 1 秒就足够了,向后跳一天。
  • new DateTime(1, 1, 1, 0, 0, timestamp) 给出正确的日期吗?
  • 我尝试使用 new DateTime(1970, 1, 1) 但没有成功,我从 1970 年开始一年

标签: javascript jquery datepicker


【解决方案1】:

这显然时区问题。

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...)

所以,在我的 PC 上,我得到了 2 小时的差异。 我想不出一个简单的方法来解决这个问题,但你可以尝试以下方法: datetimepicker getDate to return Date / Time in UTC format

【讨论】:

    【解决方案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 月 1 日对应的 unixtime 值大于零或一。因此,更正确的是,您必须将时间戳设置(而不是添加)Datetime 对象(如果您有设置器)。

      【讨论】:

        【解决方案4】:

        往返精度

        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);
        

        【讨论】:

          猜你喜欢
          • 2012-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-19
          • 2013-03-23
          • 2021-02-12
          • 1970-01-01
          相关资源
          最近更新 更多