从6.0版本开始,Npgsql如果试图保存具有非零偏移量的DateTimeOffset
字段,则会抛出异常.
例如:
public class User
{
public Guid Id { get; private set; }
public DateTimeOffset? LockedUntil { get; private set; }
public void Lock()
{
LockedUntil = DateTimeOffset.Now.Add(TimeSpan.FromDays(1));
}
}
// ...
builder.Property(u => u.Id);
builder.Property(u => u.Login);
// ...
var user = dbContext.Users.First(u => u.Id == someId);
user.Lock();
dbContext.SaveChanges();
这导致了一个例外:System.ArgumentException: ... only offset 0 (UTC) is supported
我很好奇为什么?
我的意思是我知道这是有记录的行为.
与此同时,当类型为timestamptz
时,Postgr似乎在时区中工作得很好.
SELECT '2024-04-10T15:00:00.000Z'::timestamptz = '2024-04-10T13:00:00.000-02:00'::timestamptz;
--> true
create table test_timestamptz(some_field timestamptz);
INSERT INTO test_timestamptz(some_field)
VALUES ('2024-04-10T15:00:00.000Z'), ('2024-04-10T13:00:00.000-02:00'), ('2024-04-10T20:00:00.000+05:00');
SELECT COUNT(*) FROM test_timestamptz WHERE some_field = '2024-04-10T15:00:00.000Z';
--> 3
SELECT COUNT(*) FROM test_timestamptz WHERE some_field = '2024-04-10T16:00:00.000+01:00';
--> 3
在我的项目中,我希望能够与具有不同时区的时间值工作(特别是比较它们).DateTimeOffset
给了我这个,隐藏了TZ数学.
毕竟,我最终还是用了这种转换器:
public class DateTimeOffsetToDateTimeConverter : ValueConverter<DateTimeOffset, DateTime>
{
public DateTimeOffsetToDateTimeConverter() : base(
v => v.UtcDateTime,
v => new DateTimeOffset(v))
{
}
}
会不会是某种技术限制?或者我误解了什么(C#不是我的主要PL)