質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2759閲覧

firebaseからtimestampを表示させたい。

takoyaki11

総合スコア1

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/03/21 14:54

javascript,react,firebaseで、メッセージアプリを作成中、
メッセージと一緒にtimestampも表示させようとしています。
firebaseに保存してある、content,timestampを取得はできましたが、表示させようとすると、このようなエラーが出てしまいます。
なんとか、timestampを、Data型に変換して取り出すことはできたのですが、表示させることができません。

発生している問題・エラーメッセージ

Error: Objects are not valid as a React child (found: Sun Mar 07 2021 17:11:44 GMT+0900 (日本標準時)). If you meant to render a collection of children, use an array instead.

該当のソースコード

javascript ソースコード useEffect(() => { firebase .firestore() .collection("messages") .orderBy("timestamp", "asc") .onSnapshot((snapshot) => { const messages = snapshot.docs.map((doc) => { // console.log(doc.data().timestamp); return { content: doc.data().content, timestamp: new Date(doc.data().timestamp.toDate()), }; }); setMessages(messages); console.log(messages); }); }, []); {中略} const exportMessages = () => { if (messages !== null) { return messages.map((message, index) => ( <li className="list" key={index}> {/* <span>(ユーザー名)</span> */} <ListItem> <ListItemAvatar> <Avatar alt="icon" src="/static/images/avatar/1.jpg" /> </ListItemAvatar> <span className="p-chat__bubble">{message.content}</span> <span>{message.timestamp}</span> </ListItem> </li> )); } };

試したこと

エラーメッセージで検索したり、timestampについて調べたが、わかりません。

補足情報(FW/ツールのバージョンなど)

すべて最新です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/03/21 19:53

message.timestamp は Date 型なので、toString() などで文字列にする必要があるのでは。
takoyaki11

2021/03/22 13:33

toString() にしてもエラーになりました。。。 Error: Objects are not valid as a React child (found: Invalid Date). If you meant to render a collection of children, use an array instead. こちらがエラーコードになります。。。
takoyaki11

2021/03/22 14:40

ありがとうございます! なんとか表示はできたのですが、秒ででているため、変換させようと思うのですが、またつまづいてしまったら、質問させていただいてもよろしいでしょうか。。。
takoyaki11

2021/03/22 22:42

すみません。 昨夜結局うまくいかず、今朝、こちらのmoment.jsをダウンロードしてみたのですが、どこにどう書いて使用すればいいかわかりません。。 教えていただけないでしょうか?
hoshi-takanori

2021/03/22 22:53

ダウンロード? npm または yarn はお使いではありませんか?
takoyaki11

2021/03/23 03:35

yarn add しました!
guest

回答1

0

ベストアンサー

日付を moment.js を使ってフォーマットするならこんな感じでしょうか。
参考: JavaScript|Moment.jsで日付操作(比較, 差分, フォーマット) - わくわくBank

js

1import moment from 'moment'; 2 3// 略 4 <span>{moment(message.timestamp).format('YYYY/MM/DD HH:mm')}</span>

なお、moment.js はメンテナンスモードに入ってるようなので、代わりに dsy.js を使った方がいいかも知れません。
参考: Day.jsで日付操作(比較, 差分, フォーマット) - わくわくBank

js

1import dayjs from 'dayjs'; 2 3// 略 4 <span>{dayjs(message.timestamp).format('YYYY/MM/DD HH:mm')}</span>

投稿2021/03/23 04:05

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takoyaki11

2021/03/23 11:33

ありがとうございます! timestamp: doc.data().timestamp.toDate()  によりDate型の状態にして、moment.jsを使用することで、日付と時間を表示させることができました!
takoyaki11

2021/03/23 12:03

何度もすみません。。。もしよろしければ、教えていただけないでしょうか? firebase.firestore().collection("messages").add({ content: value,  ????timestamp: firebase.firestore.FieldValue.serverTimestamp(), //こうしてデータをtimestampに保存させています }); このコードで、メッセージを入れると、下記の様なエラーが出ます。 TypeError: Cannot read property 'toDate' of null しかし、????timestamp: new Date() とすると、エラーは出ません。 この2パターンでtimestampに保存されいてる型がそれぞれ違うのでしょうか? コンソールログで確認してみた感じでは、違いはないと思いました。。。
hoshi-takanori

2021/03/24 00:38

new Date() だとクライアント側 (ブラウザ) の時刻になると思いますが、端末の時刻が狂ってたら (または故意にずらしてたら) 問題が起こる可能性がありますね。 serverTimestamp() は Firebase のサーバー側で時刻を設定するので、サーバーと通信するまでは時刻を取得できないのでしょう。
takoyaki11

2021/03/24 13:15

なるほど。 serverTimestamp()を使用して、こちらのエラーを回避する方法はあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問