Как мне получить отметку времени сервера в Cloud Functions for Firebase?

Я знаю, что вы можете получить временную метку сервера в Интернете, iOS и Android, но как насчет новых облачных функций для Firebase? Я не могу понять, как получить там временную метку сервера? Пример использования: я хочу поставить отметку времени на электронном письме, когда оно придет.

В Интернете это Firebase.database.ServerValue.TIMESTAMP

Но, похоже, это недоступно в интерфейсе сервера узла функций?

Я думаю, что уже поздно, и, возможно, я упускаю суть ...

РЕДАКТИРОВАТЬ

Я инициализирую вот так

admin.initializeApp(functions.config().firebase);
const fb = admin.database()

Тогда это называется так ...

Firebase.database.ServerValue.TIMESTAMP

Но это из-за интеграции на стороне клиента. В функциях Firebase не инициализируется таким образом. я пробовал

admin.database().ServerValue.TIMESTAMP

а также

fb.ServerValue.TIMESTAMP

person Justin Handley    schedule 23.04.2017    source источник
comment
Насколько мне известно, ServerValue.TIMESTAMP также доступен в Cloud Functions for Firebase. Можете ли вы поделиться минимальным кодом, воспроизводящим проблему?   -  person Frank van Puffelen    schedule 23.04.2017
comment
Привет, @FrankvanPuffelen! Я отредактировал оригинал с примером моей инициализации и того, что не работает.   -  person Justin Handley    schedule 24.04.2017


Ответы (8)


Поскольку вы уже используете SDK администратора, правильный синтаксис:

admin.database.ServerValue.TIMESTAMP
person Frank van Puffelen    schedule 23.04.2017
comment
Это простой ответ, который я искал - спасибо @ frank-van-puffen - person Justin Handley; 04.05.2017
comment
как с этим напечатать отметку времени в миллисекундах? admin.database.ServerValue.TIMESTAMP возвращает объект {'.sv': 'timestamp'}, который, как мне кажется, является заполнителем - person vir us; 18.12.2017
comment
Это действительно заполнитель. Чтобы получить фактическое значение, прослушайте место, куда вы пишете. - person Frank van Puffelen; 18.12.2017
comment
Может ли это отличаться от значения в обычной дате JS? - person Maduranga E; 07.05.2020

Если вы используете Firebase Admin SDK, вот правильный синтаксис (проверено 27 августа 2019 г.):

const admin = require('firebase-admin');
// or
// import * as admin from 'firebase-admin';

// Using Cloud Firestore
admin.firestore.FieldValue.serverTimestamp()

// Using Realtime Database
admin.database.ServerValue.TIMESTAMP
person Paul    schedule 07.12.2017
comment
Работает как шарм :-) Спасибо. - person Qorbani; 28.01.2018
comment
Я думаю, что для облачного хранилища огня должно быть: admin.firestore.FieldValue.serverTimestamp () - person ThdK; 28.07.2019
comment
firestore.FieldValue.serverTimestamp () не работает с функциями firebase nodejs. - person Shajeel Afzal; 10.03.2020

Чтобы прояснить для будущих читателей:

admin.database.ServerValue.TIMESTAMP возвращает non-null Object и является значением-заполнителем для автоматического заполнения текущей метки времени. Он не содержит фактической отметки времени. База данных заменит этот заполнитель, когда выполнит команду.

Если вы используете его внутри database.ref, он работает так, как вы ожидаете, и является предпочтительным способом ввода метки времени:

var sessionsRef = firebase.database().ref("sessions");
sessionsRef.push({
startedAt: firebase.database.ServerValue.TIMESTAMP // this will write 'startedAt: 1537806936331`
});

Но если вы попытаетесь использовать его вне функции базы данных (например, чтобы вернуть время сейчас или произвести некоторые вычисления), он вернет объект, который вы не можете использовать:

console.log(firebase.database.ServerValue.TIMESTAMP) // this will return an [object Object]

Подробнее об этом можно узнать в firebase.database.ServerValue и в этом SO-вопрос.

Date.now() отлично работает вне database функции, если вы хотите использовать ее для вычислений или любого другого общего использования.

console.log(Date.now()); // this will return 1537806936331

Оба они используют unix time, который представляет собой количество секунд, прошедших с 00:00:00 по всемирному координированному времени (UTC), четверг, 1 января 1970 г., и не имеет отношения к часовому поясу. Это одно и то же число на клиенте и на сервере (... или почти :-). См. unix time.

person Spiral Out    schedule 24.09.2018
comment
Лучший ответ для новичка! :) - person John T; 01.05.2019
comment
привет, когда я пишу метку времени и сохраняю ее в БД, я получил это в сообщении облачных функций: «Полезные данные обмена сообщениями содержат недопустимое значение для свойства notification.timestamp. Значения должны быть строками ». @SpiralOut - person DevAS; 24.07.2019
comment
@DevAS Попробуйте опубликовать новый вопрос с более подробной информацией о вашем коде. Но Notification.timestamp не является ключевым словом firebase db. Возможно, используйте firebase.database.ServerValue.TIMESTAMP - person Spiral Out; 25.07.2019

Я сам новичок в node.js, но Date.now () работает в моих тестах.

Изменить

Я неправильно понял ваш вопрос - не осознавал, что вы хотите добавить метку времени для данных, которые храните в базе данных Firebase. Я думал, вы просто хотите узнать время на сервере, на котором выполнялась ваша облачная функция. Если вы хотите поставить отметку времени для полученного электронного письма, хранящегося в базе данных Firebase, то использование admin.database.ServerValue.TIMESTAMP, без сомнения, является лучшим подходом.

Просто для собственного образования я написал следующую функцию, чтобы посмотреть, как сравниваются времена. Я ожидаю, что время на сервере облачных функций и сервере базы данных синхронизируется с очень точной привязкой времени. Когда я запускаю эту функцию, временная метка базы данных обычно находится в пределах ста миллисекунд от значения Date.now(). Временная метка базы данных немного позже является разумной, учитывая, что облачной функции требуется некоторое время, чтобы подключиться к базе данных и выполнить запись.

exports.timeTest = functions.database.ref('/test/trigger')
    .onWrite(event => {

        const now= Date.now();
        console.log('now=', now);

        const timeVals = {
          dateNow : now,
          serverTimestamp : admin.database.ServerValue.TIMESTAMP
        };

        return event.data.ref.parent.child('times').update(timeVals);
    });
person Bob Snyder    schedule 23.04.2017
comment
И получает ли Date.now () время сервера узла или время с клиентского компьютера для его вычисления? Или он использует какие-то стандартные часы? Если я установил время своего компьютера на одно время, тогда Date.now () установил его на другое время, а Date.now () получил бы два разных результата? - person Justin Handley; 24.04.2017
comment
@JustinHandley: Обновил мой ответ. Date.now() - это время на сервере, на котором запущена ваша облачная функция. Он полностью не зависит от времени на любом клиентском компьютере. - person Bob Snyder; 24.04.2017
comment
admin.database.ServerValue.TIMESTAMP - единственное приемлемое решение, когда вы используете правила Firebase для проверки этого this == now (Bolt) - person Luke Pighetti; 19.09.2018

Используя следующую функцию в облаке, которая эквивалентна Timestamp.now ( ) на стороне клиента, это возвращает текущую метку времени

admin.firestore.Timestamp.now()

Но если вы хотите инициализировать метку времени из объекта Date, вы можете сделать это следующим образом

admin.firestore.Timestamp.fromDate(new Date())

И если вы хотите инициализировать метку времени для будущей или прошедшей даты, сначала инициализируйте объект Date либо из строки синтаксического анализа, либо из установки времени, которое вы хотите установить, и передайте его в Timestamp.fromDate ()

var date = new Date('Wednesday, October 30, 2019 09:10 PM')
//or date = new Date('2014-06-30T06:40:53+05:30')
var timestamp = admin.firestore.Timestamp.fromDate(date)
person ked    schedule 10.01.2020

Зависит от варианта использования

Дело 1

вы хотите установить поле документа для отметки времени сервера

Пример может быть

user {
  email: "example.com",
  lastUpdated: admin.firestore.FieldValue.serverTimestamp(),
}

Примечание serverTimestamp возвращает ненулевой объект и является значением-заполнителем для автоматического заполнения текущей метки времени. Он не содержит фактической отметки времени. База данных заменит этот заполнитель при выполнении команды

* Возвращает метку, используемую с set (), create () или update (), чтобы включить сгенерированную сервером отметку времени в записанные данные.

@return Страж FieldValue для использования в вызове set (), create () или update (). *

чехол 2

вы хотите использовать метку времени сервера для своей логики функций

if (currentTime == 6pm) // TODO: send push notifications
else // TODO: do nothing

для этого вы можете сделать что-то вроде

admin.firestore.Timestamp.now() or admin.firestore.Timestamp.fromDate(new Date())

хорошее чтение: https://bigcodenerd.org/firebase-server-timestamp-cloud-functions/

person sultanmyrza    schedule 23.10.2020

Это в документации от 16 августа 2020 года.

https://cloud.google.com/firestore/docs/manage-data/add-data#server_timestamp

// Get the `FieldValue` object
const FieldValue = admin.firestore.FieldValue;

// Create a document reference
const docRef = db.collection('objects').doc('some-id');

// Update the timestamp field with the value from the server
const res = await docRef.update({
  timestamp: FieldValue.serverTimestamp()
});

Вот как я использовал это в своем коде:

const createUserDoc = (user) => {
    const FieldValue = admin.firestore.FieldValue
    return db.collection('users').doc(user.uid).set({
        memberSince: FieldValue.serverTimestamp(),
    })
}
person Collin Thomas    schedule 16.08.2020

Ты можешь попробовать:

константная отметка времени = admin.firestore.Timestamp.now ();

person Shiva Yadav    schedule 29.05.2021