Firebase TIMESTAMP 到日期和时间

Posted

技术标签:

【中文标题】Firebase TIMESTAMP 到日期和时间【英文标题】:Firebase TIMESTAMP to date and Time 【发布时间】:2016-04-15 14:13:35 【问题描述】:

我正在为我的聊天应用程序使用 firebase。在聊天对象中,我使用Firebase.ServerValue.TIMESTAMP 方法添加时间戳

我需要使用此时间戳在我的聊天应用程序中显示消息接收时间。

如果是当前时间,我只需要显示时间。有天数差异,我需要显示日期和时间或只显示日期。

我使用以下代码转换 Firebase 时间戳,但我没有得到实际时间。

var timestamp = '1452488445471';
var myDate = new Date(timestamp*1000);
var formatedTime=myDate.toJSON();

请提出这个问题的解决方案

【问题讨论】:

我认为你不必将时间戳乘以 1000 那我该如何转换呢? var myDate = new Date(timestamp); // 就是这样 你想输出什么格式? 我只想单独显示时间和日期 【参考方案1】:

对我来说,当时间戳比字符串 Intiger 时有效

var timestamp = '1452488445471';
var myDate = new Date(parseInt(timestamp));
var myDate.toDateString()

【讨论】:

【参考方案2】:

我知道 firebase 在seconds: '', and nanoseconds: '' 中给出时间戳 要转换为日期,您只需:

在一个 var ex:- const date 中花费一个 firebase 时间

然后date.toDate() => 返回日期。

【讨论】:

【参考方案3】:
    import firebaseAPP from 'firebase/app';


    public Date2firestoreTime(fromDate: Date) 
       return firebaseAPP.firestore.Timestamp.fromDate(fromDate).toMillis()
    
    public firestoreTime2Date(millisecDate: number) 
       return firebaseAPP.firestore.Timestamp.fromMillis(millisecDate).toDate()
    


    //usage:
    let FSdatenow = this.Date2firestoreTime(new Date())
    console.log('now to firestore TimeStamp', FSdatenow)
    let JSdatenow = this.firestoreTime2Date(FSdatenow)
    console.log('firestore TimeStamp to Date Obj', JSdatenow)

【讨论】:

见用法部分:-)【参考方案4】:

试试这个,

var timestamp = firebase.firestore.FieldValue.serverTimestamp()
var timestamp2 = new Date(timestamp.toDate()).toUTCString()

【讨论】:

【参考方案5】:

new Date(timestamp.toDate()).toUTCString()

【讨论】:

添加说明【参考方案6】:

我转换成这种格式

let timestamp = '1452488445471';
let newDate = new Date(timestamp * 1000)
let Hours = newDate.getHours()
let Minutes = newDate.getMinutes()
const HourComplete = Hours + ':' + Minutes
let formatedTime = HourComplete
console.log(formatedTime)

【讨论】:

【参考方案7】:

遍历这个是对我有用的精确代码。

querySnapshot.docs.forEach((e) => 
   var readableDate = e.data().date.toDate();
   console.log(readableDate);


【讨论】:

【参考方案8】:

这是一种将值从 firebase Timestamp 类型转换为 JS Date 的安全方法 如果该值不是 Timestamp,则该方法按原样返回它

适用于 Angular 7/8/9

import firebase from 'firebase';
import Timestamp = firebase.firestore.Timestamp;

export function convertTimestampToDate(timestamp: Timestamp | any): Date | any 
  return timestamp instanceof Timestamp
    ? new Timestamp(timestamp.seconds, timestamp.nanoseconds).toDate()
    : timestamp;

【讨论】:

【参考方案9】:

var date = new Date((1578316263249));//data[k].timestamp
console.log(date);

【讨论】:

【参考方案10】:

时间戳是一个对象

timestamp= nanoseconds: 0,
seconds: 1562524200

console.log(new Date(timestamp.seconds*1000))

【讨论】:

我认为这是用户我们要求的内容 完全有效并返回日期 - 日(字母)月(字母)日期(数字)年(数字)时间(hh:mm)和时区(GMT + ..)。谢谢【参考方案11】:

在 Firebase 函数内部,像这样转换时间戳:

timestampObj.toDate()
timestampObj.toMillis().toString()

这里有文档https://firebase.google.com/docs/reference/js/firebase.firestore.Timestamp

【讨论】:

【参考方案12】:

对于 Google 的新一代数据库 Firestore,以下代码将简单地帮助您解决此问题。

var admin    = require("firebase-admin");

var serviceAccount = require("../admin-sdk.json"); // auto-generated file from Google firebase.

admin.initializeApp(
  credential: admin.credential.cert(serviceAccount)
);
var db = admin.firestore();

console.log(admin.firestore.Timestamp.now().toDate());

【讨论】:

【参考方案13】:

对于那些寻找 Firebase Firestore 等效的用户。这是

firebase.firestore.FieldValue.serverTimestamp()

例如

firebase.firestore().collection("cities").add(
    createdAt: firebase.firestore.FieldValue.serverTimestamp(),
    name: "Tokyo",
    country: "Japan"
)
.then(function(docRef) 
    console.log("Document written with ID: ", docRef.id);
)
.catch(function(error) 
    console.error("Error adding document: ", error);
);

Docs

【讨论】:

我正在尝试使用此解决方案,但出现以下错误 - ReferenceError: firebase is not defined。我正在使用js Rahul,听起来您没有安装或加载 firebase 库。你用的是网页版还是Node JS版? firebase.google.com/docs/firestore/quickstart 我发现通过将新字段名称'createdAt'添加到'timestamp'值,它会自动为所有文档创建时间戳【参考方案14】:

使用 Firebase Firestone 18.0.1 (com.google.firebase.Timestamp)

val timestamp = (document.data["timestamp"] as Timestamp).toDate()

【讨论】:

【参考方案15】:

这段代码对我有用

<script src="https://www.gstatic.com/firebasejs/4.5.1/firebase.js"></script>
<script>
var config = 
    apiKey: "",
    authDomain: "",
    databaseURL: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: ""
;

firebase.initializeApp(config);
var reff = firebase.database().ref('message');
reff.on('value',haveData, haveerr);
function haveData(datahave)
    var existval= datahave.val();
    var chabi=Object.keys(existval);
    for(var d2=0;d2< chabi.length;d2++)
        var r=chabi[d2];
        var exitval=existval[r].Message;
        var exitval1=existval[r].Name;
        var exit=existval[r].Email;
        var exitval2=existval[r].Subject;
        var timestamp=existval[r].timestamp;
        var sdate=new Date(timestamp);
        var Year=sdate.getFullYear();
        var month=sdate.getMonth()+1;
        var day=sdate.getDate();
        var hh=sdate.getHours();
        var mm=sdate.getMinutes();
        var ss=sdate.getSeconds();
    


function haveerr(e)
     console.log(e);

</script>

【讨论】:

【参考方案16】:

这很简单。使用该函数以毫秒为单位获取服务器时间戳仅一次

var getServerTime = function( cb ) 
    this.db.ref( '.info/serverTimeOffset' ).once( 'value', function( snap ) 
      var offset = snap.val();

      // Get server time by milliseconds
      cb( new Date().getTime() + offset );
    );
;

现在你可以在任何地方使用它:

getServerTime( function( now ) 
    console.log( now );
);

为什么要用这种方式?

根据最新的 Firebase 文档,您应该将 Firebase 时间戳转换为毫秒。所以你可以在下面使用estimatedServerTimeMs 变量:

var offsetRef = firebase.database().ref(".info/serverTimeOffset");
offsetRef.on("value", function(snap) 
  var offset = snap.val();
  var estimatedServerTimeMs = new Date().getTime() + offset;
);

虽然 firebase.database.ServerValue.TIMESTAMP 要准确得多, 并且对于大多数读/写操作来说更可取,它有时可以是 有用的估计客户端的时钟偏差相对于 Firebase 实时数据库的服务器。您可以将回调附加到 location /.info/serverTimeOffset 获取值,以毫秒为单位, Firebase 实时数据库客户端添加到本地报告时间 (以毫秒为单位的纪元时间)来估计服务器时间。注意 此偏移的准确性可能会受到网络延迟的影响,因此 主要用于发现较大(> 1 秒)的差异 在时钟时间。

https://firebase.google.com/docs/database/web/offline-capabilities

【讨论】:

【参考方案17】:

首先Firebase.ServerValue.TIMESTAMP 不再为我工作。

所以要添加时间戳,您必须使用Firebase.database.ServerValue.TIMESTAMP

时间戳为长毫秒格式。将毫秒转换为简单的日期格式。

Ex- dd/MM/yy HH:mm:ss

你可以在java中使用如下代码:

从 firebase 数据库中获取字符串中的时间戳值

String x = dataSnapshot.getValue (String.class);

数据现在是字符串。您可以将string 转换为long

long milliSeconds= Long.parseLong(x);

然后创建 SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm:ss");

现在将您的毫秒时间戳转换为您的 sdf 格式

String dateAsString = sdf.format (milliSeconds);

之后,您可以将其解析为您的 Date 变量

 date = sdf.parse (dateAsString);

【讨论】:

问题是js而不是java【参考方案18】:

Firebase 较新版本的解决方案(2016 年 1 月之后)

将时间戳附加到数据库更新的正确方法是在请求中附加占位符值。在下面的示例中,Firebase 会将 createdAt 属性替换为时间戳:

firebaseRef = firebase.database().ref();
firebaseRef.set(
  foo: "bar", 
  createdAt: firebase.database.ServerValue.TIMESTAMP
);

根据documentation,firebase.database.ServerValue.TIMESTAMP 的值是:“Firebase 数据库服务器自动填充当前时间戳(自 Unix 纪元以来的时间,以毫秒为单位)的占位符值。”

【讨论】:

【参考方案19】:

事实上,它只有在使用时才对我有用

firebase.database.ServerValue.TIMESTAMP

在命名空间上多了一个“数据库”。

【讨论】:

但它使用像 1486106680368 这样的格式,我如何将其转换为日期和时间 @AyazAhmadTarar 如果您使用 angular,可以简单地使用它们的内置管道,例如 'Date',或者使用 angular2-moment 轻松转换时间戳 @WilliamWu 但它会使用 CLIENT 时间戳.. 不是吗? firebase ServerValue.TIMESTAMP 确保它是来自服务器的“实时”时间。【参考方案20】:

Firebase.ServerValue.TIMESTAMP 不是实际时间戳,它是常量,如果您将其设置为某个变量,它将被服务器中的实际值替换。

mySessionRef.update( startedAt: Firebase.ServerValue.TIMESTAMP );
mySessionRef.on('value', function(snapshot) console.log(snapshot.val()) )
//startedAt: 1452508763895

如果你想获取服务器时间,那么你可以使用以下代码

  fb.ref("/.info/serverTimeOffset").on('value', function(offset) 
    var offsetVal = offset.val() || 0;
    var serverTime = Date.now() + offsetVal;
  );

【讨论】:

如果您使用console.log(new Date(snapshot.val())),您将看到日期为字符串。 var date = new Date(snapshot.val()) 会给你一个对象的日期,你可以在上面调用有用的函数:developer.mozilla.org/en-US/docs/Web/javascript/Reference/…【参考方案21】:

Firebase.ServerValue.TIMESTAMPnew Date().getTime() 相同。

转换它:

var timestamp = '1452488445471';
var myDate = new Date(timestamp).getTime();

【讨论】:

Firebase.ServerValue.TIMESTAMP 是 Firebase 常量值,而不是 UNIX 时间戳。 在数据库中设置它后的返回值是一个 UNIX 时间戳,但实际命令不是,所以虽然在某些时候它们解析为相同的东西并且可以因此转换,但必须小心不要像在操作中使用 getTime 函数一样尝试使用 Firebase 时间戳值。

以上是关于Firebase TIMESTAMP 到日期和时间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 服务器时间戳生成创建日期?

Firebase 时间戳返回错误的日期 - Javascript

Firebase 导出到 BigQuery 事件时间戳时区

Firebase 的日期与时间戳

Android:从firebase获取当前日期和时间

Firebase 分析事件日期和时间戳不匹配