代码之家  ›  专栏  ›  技术社区  ›  Vik

使用firebase作为后端的移动应用程序的处理日期

  •  0
  • Vik  · 技术社区  · 7 年前

    我的问题不是针对firebase的,我认为一般来说是适用的。

    在我的例子中,移动应用(一个混合应用)在印度运行,后端是使用nodejs的firebase。这是一个食品订购应用程序。

    当一个人点菜时,我们在移动应用程序中使用(new date()).gettime(),并将其作为点菜日期传递。

    每次下订单时,firebase触发器都会在json realtime db对象中更新当天的总销售额。为了节省总销售额,我们使用一天的开始时间作为日期时间戳。计算方法如下:

     var date = new Date()
     var ms = date.getTime();
     var msPerDay = 86400 * 1000;
     var timestamp =   ms - (ms % msPerDay);
    

    我认为整个事情已经一团糟了,因为new date()将同时在印度的移动应用程序和firebase服务器(在美国北部运行)上给出不同的值。

    那么,在我的情况下,如何处理约会呢?

    1 回复  |  直到 7 年前
        1
  •  2
  •   RobG    7 年前

    什么时候? new Date() 被执行,一个 日期 实例是用表示当前时间UTC的时间值创建的。

    对于时钟准确且时区设置正确的主机,无论主机在何处或其时区设置如何,在同一时刻创建的日期都将具有时间值。然而,在“物联网”时代,主机可能是大量设备中的任何一个,其中的时钟和设置可能不准确。

    因此,您真的不应该依赖于客户机的准确性,而应该使用服务器时间来处理重要的事情。

    当你这样做的时候:

    var date = new Date()
    var ms = date.getTime();
    var msPerDay = 86400 * 1000;
    var timestamp =   ms - (ms % msPerDay);
    

    您正在将时间设置为UTC日的开始。相当于:

    var timestamp = new Date().setUTCHours(0,0,0,0);
    

    2018年11月02日,即:1541116800000。

    如果您愿意,可以存储它,但是您可能希望将其存储为人类可读的日期,在这种情况下:

    var timestamp = new Date().toISOString().slice(0,10); // 2018-11-02 on 2 Nov 2018
    

    可能适合,但通常建议使用完整字符串,因此:

    var d = new Date();
    d.setUTCHours(0,0,0,0);
    var timestamp = d.toISOString(); // 2018-11-02T00:00:00Z on 2 Nov 2018
    

    请注意,UTC日期与本地时区偏移期间的本地日期不同(因此从印度当地时间午夜到05:30将显示昨天的日期)。

    console.log(
      new Date(new Date().setUTCHours(0,0,0,0)).toISOString()
    );
    推荐文章