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,但我得到了相同的结果。

Azure移动应用程序在Sqlite数据库中保存不正确的日期时间

这看起来像是一个已经报告的bug: https://github.com/Azure/azure-mobile-apps-net-client/issues/131

请随意跟踪bug