C# 在Azure SQL上保存Datetimeoffset不起作用
我在Azure SQL server上遇到问题,在我的本地计算机上,我可以将datetimeoffset保存到db中,并且时区偏移正确地保存为 下面 然而,azure上的时区偏移正在丢失,我的列是datetimeoffset类型,我使用这个C# 在Azure SQL上保存Datetimeoffset不起作用,c#,sql-server,azure,datetimeoffset,C#,Sql Server,Azure,Datetimeoffset,我在Azure SQL server上遇到问题,在我的本地计算机上,我可以将datetimeoffset保存到db中,并且时区偏移正确地保存为 下面 然而,azure上的时区偏移正在丢失,我的列是datetimeoffset类型,我使用这个datetimeoffset.UtcNow.UtcDateTime或datetimeoffset来获取我的datetimeoffset。现在但这两种方法似乎都不起作用,总是像下面这样保存 2017-03-31 00:00:00.0000000 +00:00
datetimeoffset.UtcNow.UtcDateTime
或datetimeoffset来获取我的datetimeoffset。现在
但这两种方法似乎都不起作用,总是像下面这样保存
2017-03-31 00:00:00.0000000 +00:00
如何在Azure SQL server上保存正确的DateTimeOffset
Edit:我使用的是实体框架代码第一次迁移,我只需创建实体并使用上面的任何一行分配DateTimeOffset,然后使用context.SaveChanges()
我只对上面的RequestedDate属性感兴趣,我不明白为什么不在Azure上保存时区偏移,而是在本地工作
谢谢
。。。我正在使用此datetimeoffset.UtcNow.UtcDateTime
或datetimeoffset.Now
- 第一个总是会给您一个UTC
值(偏移量DateTime
)。它相当于+00:00
DateTime.UtcNow
- 第二个将为您提供一个
值,该值的本地时间和偏移量与运行它的计算机相匹配DateTimeOffset
- 在本地计算机上,可以看到
,因为它使用计算机的本地时区设置-05:00
- 在Azure上,您可以看到
。这是因为大多数Azure服务器和服务都将其时区设置为以UTC运行 一般来说,这是服务器的最佳选择,尤其是云中的服务器。服务器通常需要与世界各地的客户机连接,并相互交换数据。UTC是唯一合理的时区+00:00
- 在本地计算机上,可以看到
DateTime.Now
和DateTime.UtcNow
将给出相同的日期和时间值,但其中一个将其.Kind
属性设置为DateTimeKind.Local
,另一个将其设置为DateTimeKind.UTC
。由于DateTimeOffset
没有种类
(谢天谢地),在时区设置为UTC的机器上,无法区分DateTimeOffset.Now
和DateTimeOffset.UtcNow
至于该怎么办——如果你想考虑其他时区,你首先要知道那是哪个时区。然后,您可以使用TimeZoneInfo
类(如果您使用的是Windows时区)或库(如果您使用的是IANA时区)将当前UTC时间转换为该特定时区中的DateTimeOffset
使用时区信息:
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset easternNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tz);
使用:
。。。我正在使用此datetimeoffset.UtcNow.UtcDateTime
或datetimeoffset.Now
- 第一个总是会给您一个UTC
值(偏移量DateTime
)。它相当于+00:00
DateTime.UtcNow
- 第二个将为您提供一个
值,该值的本地时间和偏移量与运行它的计算机相匹配DateTimeOffset
- 在本地计算机上,可以看到
,因为它使用计算机的本地时区设置-05:00
- 在Azure上,您可以看到
。这是因为大多数Azure服务器和服务都将其时区设置为以UTC运行 一般来说,这是服务器的最佳选择,尤其是云中的服务器。服务器通常需要与世界各地的客户机连接,并相互交换数据。UTC是唯一合理的时区+00:00
- 在本地计算机上,可以看到
DateTime.Now
和DateTime.UtcNow
将给出相同的日期和时间值,但其中一个将其.Kind
属性设置为DateTimeKind.Local
,另一个将其设置为DateTimeKind.UTC
。由于DateTimeOffset
没有种类
(谢天谢地),在时区设置为UTC的机器上,无法区分DateTimeOffset.Now
和DateTimeOffset.UtcNow
至于该怎么办——如果你想考虑其他时区,你首先要知道那是哪个时区。然后,您可以使用TimeZoneInfo
类(如果您使用的是Windows时区)或库(如果您使用的是IANA时区)将当前UTC时间转换为该特定时区中的DateTimeOffset
使用时区信息:
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset easternNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tz);
使用:
如何使用将其保存到数据库?EF?ado.net?由于某些原因,datetimeShow代码中缺少时间部分如何保存itI进行编辑,我使用EF code first迁移,没有什么特别之处,只需创建实体并分配值和ctx。SaveChanges()将其强制转换为某个
日期
。向我们展示您的代码优先模型。如何使用将其保存到数据库?EF?ado.net?由于某些原因,datetimeShow代码中缺少时间部分如何保存itI进行编辑,我使用的是EF代码优先迁移,没有什么特别之处,只需创建实体并分配值和ctx.SaveChanges()您正在将其转换为某个日期。向我们展示您的代码优先模式。非常详细地解释azure时区及其工作原理,基于此,我得到以下信息,始终将datetime存储在UTC上,并手动转换为本地datetime,在我的应用程序代码中指定时区。是的,准确地说。考虑到您的代码应该显示相同的行为并记录相同的数据,而不管托管的位置或时区设置。
CreateMap<CarSearchForm, CarSearches>()
.ForMember(dest => dest.RequestedDate, opts => opts.MapFrom(src => DateTimeOffset.UtcNow.UtcDateTime))
.ForMember(dest => dest.PickupTime, opts => opts.MapFrom(src => src.TimePickup))
.ForMember(dest => dest.DropoffTime, opts => opts.MapFrom(src => src.TimePickup));
namespace Data.Entities
{
public class CarSearches
{
public int CarSearchesId { get; set; }
[Required]
public string PickupPlace { get; set; }
[Required]
public DateTimeOffset PickupDate { get; set; }
[Required]
public DateTimeOffset PickupTime { get; set; }
[Required]
public DateTimeOffset DropoffDate { get; set; }
[Required]
public DateTimeOffset DropoffTime { get; set; }
[Required]
public CarTransmission Transmission { get; set; }
[Required]
public DateTimeOffset RequestedDate { get; set; }
}
}
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset easternNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tz);
Instant now = SystemClock.Instance.Now;
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
DateTimeOffset easternNow = now.InZone(tz).ToDateTimeOffset();