在 Azure SQL 上保存 Datetimeoffset 无效
Saving Datetimeoffset on Azure SQL not working
我在使用 Azure SQL 服务器时遇到问题,在我的本地计算机上,我可以将日期时间偏移量保存到数据库中,并且时区偏移量已正确保存,如下所示
以下
2017-03-31 00:00:00.0000000 -05:00
然而天蓝色正在丢失时区偏移量,我的列是 datetimeoffset 类型,我正在使用此 DateTimeOffset.UtcNow.UtcDateTime
或 DateTimeOffset.Now
获取我的 datetimeoffset 但是这两种方法似乎都不起作用,总是保存如下
2017-03-31 00:00:00.0000000 +00:00
如何在 Azure SQL 服务器上保存正确的 DateTimeOffset。
编辑: 我正在使用 Entity Framework 代码优先迁移,我只是创建实体并使用上面的任何一行分配 DateTimeOffset 然后 context.SaveChanges().
var entity = Mapper.Map<CarSearchForm, CarSearches>(model);
ctx.CarSearches.Add(entity);
ctx.SaveChanges();
然后automapper配置文件是这样的
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 上保存时区偏移但在本地工作。
谢谢
... I'm getting my datetimeoffset using this DateTimeOffset.UtcNow.UtcDateTime
or DateTimeOffset.Now
第一个总是会给你一个 UTC DateTime
值(偏移 +00:00
)。相当于DateTime.UtcNow
.
第二个会给你一个DateTimeOffset
值,它的本地时间和偏移量与它所在的计算机运行ning相匹配。
在您的本地计算机上,您会看到 -05:00
,因为它使用您计算机的本地时区设置。
在 Azure 上,您会看到 +00:00
。这是因为大多数 Azure 服务器和服务的时区设置为 运行(UTC)。
一般来说,这是服务器的 best practice,尤其是云中的服务器。服务器经常需要与世界各地的客户端连接,并相互交换数据。 UTC 是唯一合理的时区。
另一种思考方式是,如果一台机器的时区设置为 UTC,DateTime.Now
和 DateTime.UtcNow
将给出相同的日期和时间值,但其中一个将具有其 .Kind
属性 设置为 DateTimeKind.Local
,另一个将其设置为 DateTimeKind.Utc
。由于 DateTimeOffset
没有 Kind
(谢天谢地),因此无法在时区设置为 UTC 的计算机上区分 DateTimeOffset.Now
和 DateTimeOffset.UtcNow
。
至于如何处理它 - 如果您希望考虑其他时区,您首先必须知道是哪个时区。然后,您可以使用 TimeZoneInfo
class(如果您使用 Windows 时区)或 Noda Time 库(如果您使用 IANA 时区)来将当前 UTC 时间转换为该特定时区的 DateTimeOffset
。
使用TimeZoneInfo
:
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset easternNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tz);
使用Noda Time:
Instant now = SystemClock.Instance.Now;
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
DateTimeOffset easternNow = now.InZone(tz).ToDateTimeOffset();
我在使用 Azure SQL 服务器时遇到问题,在我的本地计算机上,我可以将日期时间偏移量保存到数据库中,并且时区偏移量已正确保存,如下所示 以下
2017-03-31 00:00:00.0000000 -05:00
然而天蓝色正在丢失时区偏移量,我的列是 datetimeoffset 类型,我正在使用此 DateTimeOffset.UtcNow.UtcDateTime
或 DateTimeOffset.Now
获取我的 datetimeoffset 但是这两种方法似乎都不起作用,总是保存如下
2017-03-31 00:00:00.0000000 +00:00
如何在 Azure SQL 服务器上保存正确的 DateTimeOffset。
编辑: 我正在使用 Entity Framework 代码优先迁移,我只是创建实体并使用上面的任何一行分配 DateTimeOffset 然后 context.SaveChanges().
var entity = Mapper.Map<CarSearchForm, CarSearches>(model);
ctx.CarSearches.Add(entity);
ctx.SaveChanges();
然后automapper配置文件是这样的
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; }
}
}
谢谢
... I'm getting my datetimeoffset using this
DateTimeOffset.UtcNow.UtcDateTime
orDateTimeOffset.Now
第一个总是会给你一个 UTC
DateTime
值(偏移+00:00
)。相当于DateTime.UtcNow
.第二个会给你一个
DateTimeOffset
值,它的本地时间和偏移量与它所在的计算机运行ning相匹配。在您的本地计算机上,您会看到
-05:00
,因为它使用您计算机的本地时区设置。在 Azure 上,您会看到
+00:00
。这是因为大多数 Azure 服务器和服务的时区设置为 运行(UTC)。一般来说,这是服务器的 best practice,尤其是云中的服务器。服务器经常需要与世界各地的客户端连接,并相互交换数据。 UTC 是唯一合理的时区。
另一种思考方式是,如果一台机器的时区设置为 UTC,DateTime.Now
和 DateTime.UtcNow
将给出相同的日期和时间值,但其中一个将具有其 .Kind
属性 设置为 DateTimeKind.Local
,另一个将其设置为 DateTimeKind.Utc
。由于 DateTimeOffset
没有 Kind
(谢天谢地),因此无法在时区设置为 UTC 的计算机上区分 DateTimeOffset.Now
和 DateTimeOffset.UtcNow
。
至于如何处理它 - 如果您希望考虑其他时区,您首先必须知道是哪个时区。然后,您可以使用 TimeZoneInfo
class(如果您使用 Windows 时区)或 Noda Time 库(如果您使用 IANA 时区)来将当前 UTC 时间转换为该特定时区的 DateTimeOffset
。
使用TimeZoneInfo
:
DateTime utcNow = DateTime.UtcNow;
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset easternNow = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tz);
使用Noda Time:
Instant now = SystemClock.Instance.Now;
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
DateTimeOffset easternNow = now.InZone(tz).ToDateTimeOffset();