2017-03-22 50 views
1
我在與SQL Azure的服務器出現問題

,我的本地機器上,我可以節省DATETIMEOFFSET到DB和時區偏移正確保存像 下面保存DATETIMEOFFSET Azure上的SQL不工作

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。我使用實體框架代碼第一次遷移,我只是創建實體,並使用上面的任何行,然後context.SaveChanges()分配DateTimeOffset。

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

} 

enter image description here 我只是在RequestedDate物業感興趣以上,我就想不通它爲什麼不保存在Azure上的時區偏移量,但在本地工作。

感謝

+0

如何使用它保存到數據庫? EF? ado.net?由於某些原因,你的日期時間部分丟失 – RAS

+0

顯示代碼如何保存它 – Lanorkin

+0

我做了一個編輯,我使用EF代碼第一次遷移,沒有什麼特別的,只需創建實體並賦值和ctx.SaveChanges( ) –

回答

3

...我收到使用該DateTimeOffset.UtcNow.UtcDateTimeDateTimeOffset.Now

  • 第一個總是要給你一個UTC DateTime值(偏移+00:00我DATETIMEOFFSET )。它相當於DateTime.UtcNow

  • 第二個會給你一個DateTimeOffset值,它的本地時間和偏移量與它運行的計算機相匹配。

    • 在本地計算機上,你看到-05:00,因爲它使用您的計算機的本地時區設置。

    • 在Azure上,您看到+00:00。這是因爲大多數Azure服務器和服務的時區都設置​​爲以UTC運行。

      一般來說,這是服務器的best practice,尤其是雲中的服務器。服務器通常需要與世界各地的客戶連接,並互相交換數據。 UTC是唯一明智的時區。

另一種方式去思考它,如果一臺機器的時區設置爲UTC,DateTime.NowDateTime.UtcNow會給出相同的日期和時間值,但一個都有其.Kind屬性設置爲DateTimeKind.Local另一個將它設置爲DateTimeKind.Utc。由於DateTimeOffset沒有Kind(幸好),因此在時區設置爲UTC的機器上無法區分DateTimeOffset.NowDateTimeOffset.UtcNow

至於如何處理它 - 如果您希望將其他時區考慮在內,您首先必須知道哪個時區是。然後,您可以使用TimeZoneInfo類(如果您使用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(); 
+1

關於azure時區以及它是如何工作的非常詳細的解釋,基於我得到以下內容,始終將UTC存儲日期時間並將其轉換爲本地日期時間,手動指定我的應用程序代碼上的時區。 –

+1

是的,確切地說。考慮到你的代碼應該表現出相同的行爲並記錄相同的數據,而不管它託管的位置或服務器設置的時區。 –