在Azure SQL上保存Datetimeoffset不起作用

时间:2017-03-22 05:18:36

标签: c# sql-server azure datetimeoffset

我遇到Azure SQL服务器的问题,在我的本地计算机上我可以将datetimeoffset保存到数据库中,并且正确保存时区偏移量 以下

2017-03-31 00:00:00.0000000 -05:00

然而在azure上丢失了时区偏移量,我的列是datetimeoffset类型,我使用这个DateTimeOffset.UtcNow.UtcDateTimeDateTimeOffset.Now得到了我的datetimeoffset,但似乎没有任何方法可行,总是像下面的

2017-03-31 00:00:00.0000000 +00:00

如何在Azure SQL服务器上保存正确的DateTimeOffset。

编辑:我正在使用实体框架代码优先迁移,我只是使用上面的任何一行创建实体并分配DateTimeOffset,然后使用context.SaveChanges()。

var entity = Mapper.Map<CarSearchForm, CarSearches>(model);
 ctx.CarSearches.Add(entity);
 ctx.SaveChanges();

然后自动化配置文件就像这样

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; }        
    }

}

enter image description here 我只对上面的RequestedDate属性感兴趣,我无法弄清楚为什么不在Azure上保存时区偏移但在本地工作。

由于

1 个答案:

答案 0 :(得分:3)

  

...我正在使用此DateTimeOffset.UtcNow.UtcDateTimeDateTimeOffset.Now

获取我的datetimeoffset
  • 第一个总是会给你一个UTC DateTime值(偏移+00:00)。它相当于DateTime.UtcNow

  • 第二个会给你一个DateTimeOffset值,其本地时间和偏移量与运行它的计算机相匹配。

    • 在您的本地计算机上,您会看到-05:00,因为它使用了您计算机的本地时区设置。

    • 在Azure上,您会看到+00:00。这是因为大多数Azure服务器和服务都设置为以UTC格式运行的时区。

      通常,这是服务器的best practice,尤其是云中的服务器。服务器通常需要与世界各地的客户端连接,并相互交换数据。 UTC是唯一明智的时区。

另一种思考方式是,如果计算机的时区设置为UTC,DateTime.NowDateTime.UtcNow将提供相同的日期和时间值,但其中一个将具有{{1} } property设置为.Kind,另一个设置为DateTimeKind.Local。由于DateTimeKind.Utc没有DateTimeOffset(谢天谢地),因此在时区设置为UTC的计算机上无法区分KindDateTimeOffset.Now

至于如何处理 - 如果你想要考虑其他时区,你首先要知道是哪个时区。然后,您可以使用DateTimeOffset.UtcNow类(如果您使用的是Windows时区),或Noda Time库(如果您使用的是IANA时区)将当前UTC时间转换为{ {1}}在该特定时区。

使用TimeZoneInfo

DateTimeOffset

使用Noda Time

TimeZoneInfo