在django和javascript之间传递datetime时保持微秒精度

在django和javascript之间传递datetime时保持微秒精度,javascript,django,time,precision,Javascript,Django,Time,Precision,django或sqlite数据库似乎正在以微秒的精度存储日期时间。但是,当Date对象仅支持毫秒时: var stringFromDjango = "2015-08-01 01:24:58.520124+10:00"; var time = new Date(stringFromDjango); $('#time_field').val(time.toISOString()); //"2015-07-31T15:24:58.520Z" 注意58.520124现在是58.520 例如,当我想为d

django或sqlite数据库似乎正在以微秒的精度存储日期时间。但是,当
Date
对象仅支持毫秒时:

var stringFromDjango = "2015-08-01 01:24:58.520124+10:00";
var time = new Date(stringFromDjango);
$('#time_field').val(time.toISOString()); //"2015-07-31T15:24:58.520Z"
注意
58.520124
现在是
58.520

例如,当我想为datetime小于或等于现有对象时间的所有对象(即
MyModel.objects.filter(time\u lte=javascript\u datetime)
)创建查询集时,这就成了一个问题。通过截断微秒,对象不再显示在列表中,因为时间不相等

我怎样才能解决这个问题?是否有支持微秒精度的datetime javascript对象?我可以将数据库中的时间截断为毫秒(我几乎在任何地方都使用),还是要求以较低的精度执行查询

我怎样才能解决这个问题

TL;DR:通过以下两种方式存储精度较低的数据:

  • 诱使您的DB平台只存储毫秒,并放弃任何额外的精度(我认为在SQLite上很难)
  • 仅以您想要的精度插入值(难以确保涵盖所有情况)
是否有支持微秒精度的datetime javascript对象

如果您将日期编码为字符串或数字,您可以添加任意精度。还有其他选择(一些已讨论)。除非你真的想要这样的准确度,否则这可能不是最好的方法

我可以将数据库中的时间截断为毫秒吗

是的,但是因为你在SQLite上,所以有点奇怪。SQLite没有真正的日期;实际上,您正在将值存储在
文本
实数
整型
字段中。这些底层存储类规定了可以存储的值的精度和范围。有一个像样的

例如,您可以将基础存储类更改为
integer
。这会将存储在该字段中的日期截断到1秒的精度。当从JS执行查询时,同样可以使用。例如

一个功能更完善的DB平台将更好地处理它。例如,在PostgreSQL中,您可以。这将添加一个时间戳列,精度低至毫秒(与Javascript匹配)

MySQL会的

。。或者要求降低查询的准确性

是的,但这通常是错误的方法

如果你过滤的标准是精确的,那么你就可以了;您可以截断该值,然后进行筛选(如上面的
.setmillizes()
示例中所示)。但是,如果您要检查的数据库中的值太精确,那么您将度过一段不愉快的时光

您可以编写一个查询,以便在与您的条件进行比较之前格式化或截断存储值以降低其精度,但需要对存储的每个值执行该操作。这可能是数百万个值。更重要的是,因为您是动态生成值的,所以您只是绕过了针对存储值创建的任何索引

MyModel.objects.filter(time__lte = javascript_datetime.setMilliseconds(0))
alter table "my_table" add "my_timestamp" timestamp (3) with time zone