【问题标题】:How to get correct date and month on node.js and Cloud Functions for Firebase?如何在 node.js 和 Cloud Functions for Firebase 上获取正确的日期和月份?
【发布时间】:2017-09-01 02:02:44
【问题描述】:

我在 Cloud Functions for Firebase 上使用的节点服务器上使用纯 JavaScript。 json 名称为:trial.json

[{
    "date": "0822",
    "message": "Have a nice day on 0822"
 },
 {
    "date": "0823",
    "message": "Have a nice day on 0823"
 },
 {
    "date": "0824",
    "message": "Have a nice day on 0824"
 },
 {
    "date": "0825",
    "message": "Have a nice day on 0825"
 },
 {
    "date": "0826",
    "message": "Have a nice day on 0826"
 },
 {
    "date": "0827",
    "message": "Have a nice day on 0827"
 },
 {
    "date": "0828",
    "message": "Have a nice day on 0828"
 },
 {
    "date": "0829",
    "message": "Have a nice day on 0829"
 },
 {
    "date": "0830",
    "message": "Have a nice day on 0830"
 },
 {
    "date": "0831",
    "message": "Have a nice day on 0831"
 }]

index.js 是

var fs = require("fs");
var contents = fs.readFileSync("trial.json");
var jsonContent = JSON.parse(contents);
console.log("Content", jsonContent)
var today = month + date;
var currentDate;
var selectedCeleb = 0;

for (var index = 0; index < jsonContent.length; ++index) {
  var curr = jsonContent[index];
  if(curr.date == today){
      currentDate = curr;
      break;
  }
}
console.log("message : " + currentDate.message)
// Request Response Pair
exports.myApp = functions.https.onRequest((request, response) => {
  const app = new App({ request, response });
  console.log('Request headers: ' + JSON.stringify(request.headers));
  console.log('Request body: ' + JSON.stringify(request.body));

function getDayMessage() {
  return currentDate.message;
}

function userMessage (app) {
  let dayMsg = getDayMessage();
  if (app.hasSurfaceCapability(app.SurfaceCapabilities.SCREEN_OUTPUT)) {
      app.ask(app.buildRichResponse()
        .addSimpleResponsedayMsg))
    } else {
        app.ask(dayMsg, NO_INPUTS);    
    }
 }

  let actionMap = new Map();
  actionMap.set(USER_INTERESTED, userMessage);
  app.handleRequest(actionMap);
});

我本地返回的月+日值为 0829 而在服务器上是 0827。

请帮助确定是设置问题还是代码问题,以便我可以更新代码以获得正确的值。

【问题讨论】:

    标签: javascript node.js firebase google-cloud-functions


    【解决方案1】:

    您的本地计算机可能与运行 Cloud Functions 的服务器处于不同的时区。当您在 Date 对象上使用 getMonth() 和 getDate() 时,它们将在您的本地时间返回这些值,这可能是与世界其他时区不同的日期。

    getTimezoneOffset() 将为您提供您的时区与 UTC 偏移的分钟数:

    new Date().getTimezoneOffset()
    

    我住在加利福尼亚的太平洋标准时间,所以在我的本地机器上返回 420。

    Cloud Functions 服务器设置为 UTC,因此该函数返回 0。

    您的机器会返回什么?与 Cloud Functions 服务器相比,可能某些值会使您在一天中的大部分时间处于不同的日期。 “正确”日期取决于您的时区。如果您想要一个特定的时区,则必须对 Date 对象进行一些数学运算以获取您要查找的值。

    【讨论】:

    • 如何解释2天的差异?
    • 您确定您机器上的时钟设置正确吗?我机器上 Date 对象的 toUTCString() 值与 Cloud Functions 的值匹配,这意味着它们是同步的。
    • 我不是 OP,但我运行了他的代码并得到了 0829。你收到 0827 了吗?!
    • @DougStevenson 时钟在哪台机器上?本地似乎是正确的,我们需要在 Firebase Cloud Functions 上设置什么吗?我可以通过任何方式登录机器(服务器)并检查这些值吗?
    • 据我所知,Cloud Functions 是正确的。如果不是这样,那将是灾难性的。 Google 在确保服务器日期正确方面付出了很多努力。
    【解决方案2】:

    道格史蒂文森: 不知道会是什么解释,但只是降级到 Spark 它可以正常工作。因此,无论这种大火(现收现付)正在做什么都会导致问题。我当然会保持打开状态,稍后再使用。

    【讨论】:

    • 我的项目在 Blaze 上,我无法重现。请联系 Firebase 支持。 firebase.google.com/support/contact/troubleshooting
    • @DougStevenson 所以每次返回 0829 对你来说?
    • 是的,当我在 HTTP 函数中运行代码时,由 HTTP 请求按需触发
    • 我改回blaze试了一下,这次效果很好,会不会有日期被缓存之类的情况?
    • 您的函数代码看起来不像一个完整的函数。你的模块出口在哪里?它是一个什么样的功能?数据库触发器? HTTP?还有什么?你是怎么触发的?
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2021-12-16
    • 2017-12-24
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多