C# 在Azure SQL上保存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

我在Azure SQL server上遇到问题,在我的本地计算机上,我可以将datetimeoffset保存到db中,并且时区偏移正确地保存为 下面

然而,azure上的时区偏移正在丢失,我的列是datetimeoffset类型,我使用这个
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上,您可以看到
      +00:00
      。这是因为大多数Azure服务器和服务都将其时区设置为以UTC运行

      一般来说,这是服务器的最佳选择,尤其是云中的服务器。服务器通常需要与世界各地的客户机连接,并相互交换数据。UTC是唯一合理的时区

另一种考虑方法是,如果机器的时区设置为UTC,
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上,您可以看到
      +00:00
      。这是因为大多数Azure服务器和服务都将其时区设置为以UTC运行

      一般来说,这是服务器的最佳选择,尤其是云中的服务器。服务器通常需要与世界各地的客户机连接,并相互交换数据。UTC是唯一合理的时区

另一种考虑方法是,如果机器的时区设置为UTC,
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();