EFCore Postgres时间戳失去刻度精度

时间:2019-09-20 00:00:37

标签: c# postgresql .net-core ef-core-2.2

我的应用程序出现问题,该应用程序正在从JSON API读取数据,该JSON API以以下格式提供UTC时间:

2019-09-19T23:46:00.1183275Z

我将这些时间存储在使用Entity Framework Core的Postgres数据库中,并在以后使用它们以确保仅从API获取新数据。我遇到的问题是,当这些时间戳记写入数据库时​​,我失去了.NET精确到时间戳记的精确度。 C#将上述时间戳记的刻度记为637045335601183275,但是当我从数据库中读取同一时间时,刻度记为637045335601183270

我尝试搜索文档,但是找不到改变数据库中时间戳精度的方法。有办法吗?否则,是否有一种一致的方法可以将DateTime舍入到数据库不会丢失的精度?

示例:

上下文

public class MyContext : DbContext
{
    public DbSet<Item> Items { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(@"host=localhost;port=5432;database=TestDb;user id=postgres;password=password");
    }
}

项目

public class Item
{
    public int Id { get; set; }
    public DateTime CreateTime { get; set; }
}

程序

class Program
{
    static void Main(string[] args)
    {
        var item = JsonConvert.DeserializeObject<Item>("{Id: 1, CreateTime: \"2019-09-19T23:46:00.1183275Z\"}");
        Item readItem;

        using(var context = new MyContext())
        {
            context.Items.Add(item);
            context.SaveChanges();
        }

        using(var context = new MyContext())
        {
            readItem = context.Items.First();
        }

        Console.WriteLine(item.CreateTime.Ticks.Equals(readItem.CreateTime.Ticks)); //Outputs False
    }
}

以上是使用EFCore 2.2.6和Npgsql.EntityFrameworkCore.PostgreSQL 2.2.4创建的

1 个答案:

答案 0 :(得分:2)

  

我尝试搜索文档,但是找不到方法   更改数据库中时间戳的精度。有办法吗?

不,没有。

Postgres日期/时间类型仅精确to the microsecond(1 / 1,000,000秒)。

.NET日期以100 nanosecond为单位,称为“滴答”(滴答是1 / 10,000,000秒)。

由于每毫秒有10个刻度,因此.NET日期不会通过Postgres来回跳动。

  

无法通过一致的方式将DateTime舍入为   数据库不会丢失的精度?

是-DateTime的构造函数使用Ticks。因此,您可以使用item.CreateTime.Ticks来获取初始刻度值,以某种方式对其进行更改(确定是否要达到上限或下限或圆形或任何其他值),然后将其传递给构造函数。然后,该值(精确到微秒)就可以通过Postgres进行往返。