Azure移动应用程序在Sqlite数据库中保存不正确的日期时间
本文关键字:不正确 保存 日期 时间 数据库 移动 应用程序 Sqlite Azure | 更新日期: 2023-09-27 18:11:42
我试图在Xamarin Forms应用程序中的AzureMobileServicesClient SQLite数据库中保存具有ID和DateTimeOffset的实体。
只要时间戳不是二义性的,就可以正常工作。当我们从夏令时过渡到标准时间时,会有一段时间,根据时区的不同,时间戳可能会有歧义。2016年丹麦的时间是10月30日凌晨2:00-3:00。
我保存实体DateTimeOffset作为UTC,但它保存为本地时间戳。
当我保存一个模棱两可的时间戳为2016-10-30 12:30 AM +0:00时,它返回为2016-10-30 11:30 AM +0:00。我已经在其他时区测试过了,它只发生在特定时区从夏令时到标准时间的模糊时间。
我已经看到一个正常的SQLite数据库在这里修复的问题:http://www.thomaslevesque.com/2015/06/28/how-to-retrieve-dates-as-utc-in-sqlite/
但是因为我使用azuremobileserves解决方案不工作在这种情况下。
在这段代码中,我初始化AzureMobileService,保存一个模棱两可的时间戳,然后再次检索它,并将这两个时间写到屏幕上,以查看不同的输出
public static class SaveTimeStamp
{
public static async Task Save()
{
//Init mobile service Client
var mobileService = new MobileServiceClient(Configuration.MobileAppsUrl);
//init MobileService Database
var dataStore = DependencyService.Get<IDataStore>();
var path = dataStore.GetPath("store.db");
dataStore.CreateFile(path);
var store = new MobileServiceSQLiteStore(path);
store.DefineTable<Entity>();
await mobileService.SyncContext.InitializeAsync(store, StoreTrackingOptions.NotifyLocalAndServerOperations).ConfigureAwait(false);
var entityTable = mobileService.GetSyncTable<Entity>();
//Save entity with ambiguous timestamp
var ambiguousTimestamp = new DateTimeOffset(2016, 10, 30, 0, 30, 0, TimeSpan.Zero); //UTC: 30th of October 12:30 AM + 0:00 => DK time:30th of october 2:30 AM + 2:00
var entity = new Entity
{
Id = Guid.NewGuid().ToString(),
Timestamp = ambiguousTimestamp
};
Debug.WriteLine("Saving datetime UTC: " + entity.Timestamp.UtcDateTime);
await entityTable.InsertAsync(entity).ConfigureAwait(false);
//Fetch saved entity
var refecthedEntities = await entityTable.Where(e => e.Id == entity.Id).ToListAsync();
var refecthedEntity = refecthedEntities.FirstOrDefault();
if (refecthedEntity.Timestamp != ambiguousTimestamp)
{
Debug.WriteLine("Refecthed datetime UTC do not match: " + refecthedEntity.Timestamp.UtcDateTime);
}
else
{
Debug.WriteLine("Refecthed datetime UTC: " + refecthedEntity.Timestamp.UtcDateTime);
}
//output
//[0:]Saving datetime UTC: 10/30/2016 12:30:00 AM
//[0:]Refecthed datetime UTC do not match: 10/29/2016 11:30:00 PM
}
}
class Entity
{
public string Id { get; set; }
public DateTimeOffset Timestamp { get; set; }
}
因为这是一个Xamarin应用程序,所以在Xamarin中也有一些代码。用于初始化数据库的Ios项目。
//IN Xamarin.IOS
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init(); //Init Azure mobileservies on IOS Current IOS 9.3
SQLitePCL.CurrentPlatform.Init();
LoadApplication(new App());
App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width;
App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height;
return base.FinishedLaunching(app, options);
}
public override void WillEnterForeground(UIApplication uiApplication)
{
base.WillEnterForeground(uiApplication);
uiApplication.IdleTimerDisabled = true;
}
public override void DidEnterBackground(UIApplication uiApplication)
{
base.DidEnterBackground(uiApplication);
uiApplication.IdleTimerDisabled = false;
}
}
我试图使用一个DateTime而不是DateTimeOffset上的实体,只使用DateTimeKind=UTC,但我得到了相同的结果。
这看起来像是一个已经报告的bug: https://github.com/Azure/azure-mobile-apps-net-client/issues/131
请随意跟踪bug