如何在 PostreSQL 中存储 DateTimeOffset

GBr*_*n12 7 c# postgresql entity-framework datetimeoffset

我在DateTimeOffset使用实体框架从 PostgreSQL 数据库检索 a 时遇到问题。就研究问题而言,我发现这篇文章可以帮助我了解问题所在,但我无法弄清楚如何解决它。

我有一个允许用户上传文件(主要是图像)的 API,它提取图像的拍摄日期并将其存储在数据库中。它在大多数情况下都很好用。但是,如果日期在 2007 年之前的 3 月 11 日到 4 月的某个时间(日期因年份而异),它会很好地保存到数据库中,但是在尝试检索该行时,它会抛出错误:

本地 dateTime 参数的 UTC 偏移量与偏移参数不匹配。

Timestamp With Time Zone在 postgreSQL 中使用该CameraDate字段的类型。我不知道如何让它正常工作。如果有一种方法可以在不更改数据库的情况下做到这一点,那将是可取的。

例子:

2001-04-01 10:47:17-06 Works
2001-03-01 10:47:17-06 Works
2001-03-13 10:47:17-06 Doesn't work
2007-03-13 10:47:17-06 Works
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

Context.Files.Add(file);
Context.Entry(file).Reload();
Run Code Online (Sandbox Code Playgroud)

文件类如下所示(为简洁起见,删除了一些字段):

public class File
{
    [Column("FileId")]
    public override Guid ID { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DisplayId { get; set; }
    public DateTimeOffset? CameraDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*int 3

DateTimeOffset好的,这似乎是npgsql 或 npgsql.EntityFramework 中的错误。他们的问题跟踪器中似乎还记录了其他几个问题。特别是问题 #542非常接近 - 但有不同的异常消息。

我建议您在那里创建一个新问题,因为它们是帮助进一步诊断此问题的最佳方法。

  • 看起来 Pgsql 的开发人员目前建议不要使用“DateTimeOffset”和“timestamp with time zone”。请参阅以此[评论]开头的讨论(https://github.com/npgsql/Npgsql.EntityFrameworkCore.PostgreSQL/issues/473#issuecomment-404881849) (3认同)