我遇到Azure SQL服务器的问题,在我的本地计算机上我可以将datetimeoffset保存到数据库中,并且正确保存时区偏移量 以下
2017-03-31 00:00:00.0000000 -05:00
然而在azure上丢失了时区偏移量,我的列是datetimeoffset类型,我使用这个DateTimeOffset.UtcNow.UtcDateTime
或DateTimeOffset.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; }
}
}
我只对上面的RequestedDate属性感兴趣,我无法弄清楚为什么不在Azure上保存时区偏移但在本地工作。
由于
答案 0 :(得分:3)
...我正在使用此
获取我的datetimeoffsetDateTimeOffset.UtcNow.UtcDateTime
或DateTimeOffset.Now
第一个总是会给你一个UTC DateTime
值(偏移+00:00
)。它相当于DateTime.UtcNow
。
第二个会给你一个DateTimeOffset
值,其本地时间和偏移量与运行它的计算机相匹配。
在您的本地计算机上,您会看到-05:00
,因为它使用了您计算机的本地时区设置。
在Azure上,您会看到+00:00
。这是因为大多数Azure服务器和服务都设置为以UTC格式运行的时区。
通常,这是服务器的best practice,尤其是云中的服务器。服务器通常需要与世界各地的客户端连接,并相互交换数据。 UTC是唯一明智的时区。
另一种思考方式是,如果计算机的时区设置为UTC,DateTime.Now
和DateTime.UtcNow
将提供相同的日期和时间值,但其中一个将具有{{1} } property设置为.Kind
,另一个设置为DateTimeKind.Local
。由于DateTimeKind.Utc
没有DateTimeOffset
(谢天谢地),因此在时区设置为UTC的计算机上无法区分Kind
和DateTimeOffset.Now
。
至于如何处理 - 如果你想要考虑其他时区,你首先要知道是哪个时区。然后,您可以使用DateTimeOffset.UtcNow
类(如果您使用的是Windows时区),或Noda Time库(如果您使用的是IANA时区)将当前UTC时间转换为{ {1}}在该特定时区。
使用TimeZoneInfo
:
DateTimeOffset
使用Noda Time:
TimeZoneInfo