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: ''
中给出时间戳
要转换为日期,您只需:
然后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.TIMESTAMP
与new Date().getTime()
相同。
转换它:
var timestamp = '1452488445471';
var myDate = new Date(timestamp).getTime();
【讨论】:
Firebase.ServerValue.TIMESTAMP 是 Firebase 常量值,而不是 UNIX 时间戳。 在数据库中设置它后的返回值是一个 UNIX 时间戳,但实际命令不是,所以虽然在某些时候它们解析为相同的东西并且可以因此转换,但必须小心不要像在操作中使用 getTime 函数一样尝试使用 Firebase 时间戳值。以上是关于Firebase TIMESTAMP 到日期和时间的主要内容,如果未能解决你的问题,请参考以下文章