【问题标题】:Problems with formatting date with moment.js in React在 React 中使用 moment.js 格式化日期的问题
【发布时间】:2019-09-20 09:39:56
【问题描述】:

我正在使用 Open Weather Map API 在 React 中创建天气应用程序,如您所知,API 为我们提供了 5 天/3 小时预报的数据。此外,由于 API 默认使用 GMT Unix 时间戳格式,我决定将其格式化为“MM-DD-YYYY”以便轻松处理日期。但问题是当我尝试在 moment.js 中进一步将“MM-DD-YYYY”转换为 LT 格式时,我丢失了 date 中的时间日期,默认情况下所有时间都为 12:00 AM。如果我们尝试将原始 GMT Unix 时间戳格式转换为“MM-DD-YYYY”,然后将“MM-DD-YYYY”进一步转换为“LT”,我们是否会丢失 GMT Unix 时间戳中的时间?

import React, { Fragment, Component } from "react";
import "bootstrap/dist/css/bootstrap.min.css";
import SearchBox from "./Containers/SearchBox/SearchBox";
import Header from "./Components/Header/Header";
import styles from "./App.module.css";
import CardContainer from "./Containers/CardContainer/CardContainer";
import Footer from "./Components/Footer/Footer";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import About from "./Components/About/About";
import axios from "axios";
import WeatherDay from "./Components/WeatherDay/WeatherDay";
class App extends Component {
  state = {
    title: null
  };

  getTitle = location => {
    axios
      .get(
        `http://api.openweathermap.org/data/2.5/forecast?q=${location}&APPID=7ad09d078633b652ecef8587a337639e&units=metric`
      )
      .then(res => {
        this.setState({
          title: res
        });
      })
      .catch(err => {
        console.log(err);
      });
  };

  render() {
    return (
      <Router>
        <div className={styles.App}>
          <Fragment>
            <Header title={"Weather App"} />
            <Switch>
              <Route
                path="/"
                exact
                render={props => (
                  <Fragment>
                    <div className="container">
                      <SearchBox getRequest={this.getTitle} />
                    </div>
                    <main className={styles.mainContent}>
                      <h1 className={styles.cityWeather}>
                        {this.state.title && this.state.title.data.city.name}
                      </h1>
                      <CardContainer
                        weatherData={
                          this.state.title && this.state.title.data.list
                        }
                      />
                    </main>
                  </Fragment>
                )}
              />

              <Route path="/about" component={About} />
              <Route
                path="/day/:date"
                render={props => (
                  <WeatherDay {...props} title={this.state.title} />
                )}
              />
            </Switch>
            <Footer copyright={"Copyright 2018"} />
          </Fragment>
        </div>
      </Router>
    );
  }
}

export default App;


import React from "react";
import "./WeatherDay.module.css";
import moment from "moment";
const WeatherDay = props => { // This is the component where I have a problem with conversion
  const allDays =
    props.title &&
    props.title.data.list.map(item => ({
      date: moment(new Date(item.dt_txt)).format("MM-DD-YYYY"),
      main: item.main,
      weather: item.weather
    }));
  const chosenDate = props.match.params.date;

  const day =
    props.title &&
    allDays.filter((item, index) => {
      return item.date === chosenDate;
    });

  const mir =
    props.title &&
    day.map(item => { //Here I am trying to convert "MM/DD/YYYY" into "LT" and lose time info
      return <p>{moment(new Date(item.date)).format("LT")}</p>;
    });

  return (
    <div className="row">
      <div className="col-md-2"></div>
      {mir}
            </div>
          );
        })}
    </div>
  );
};

export default WeatherDay;

【问题讨论】:

  • 提供您要转换的采样日期。
  • @ravibagul91,好的,补充说我在 WeatherDay 组件中的转换存在问题,该组件位于上面的代码块下方。谢谢:)
  • @ravibagul91,如果有什么不清楚的地方请告诉我:)。感谢您的帮助
  • 嗨狄更斯,检查我的解决方案,如果有帮助,请告诉我。
  • @ravibagul91,嗨,伙计,我试过了,但没有结果:(。让我解释一下逻辑,我故意使用“MM-DD-YYYY”来删除日期中的时间。因为打开的天气图提供了 5 /3 json,我想根据用户点击的日期获取所有数据,例如,如果用户在星期三点击,则应检索有关星期三的所有数据。如果我不删除时间,那么只会给我一个数据,但我想要所选日期的所有数据。

标签: javascript reactjs


【解决方案1】:

我觉得你搞错了。这里。您不应该使用时间字符串来实际计算它,只更改日期的格式,但保留实际的时刻对象以供进一步计算。这样您总能找到正确的时间和日期。

【讨论】:

    【解决方案2】:

    我认为问题是由于这个,

    date: moment(new Date(item.dt_txt)).format("MM-DD-YYYY")
    

    当您按上述方式转换日期时,它会从中剔除时间并得到简单的日期。

    应该是这样的,

    date: moment(new Date(item.dt_txt)).format("MM-DD-YYYY, h:mm:ss a")
    

    Demo

    【讨论】:

      【解决方案3】:

      我认为您在已格式化的日期上进行格式化。您应该维持时刻对象而不是格式化日期。

      您应该仅在渲染时格式化日期。在传递时,我们传递moment 对象。

      例子

      let parsed = moment(new Date())
      let format1 = parsed.format('MM-DD-YYYY')
      let format2 = parsed.format('LT')
      console.log(format1) // 09-20-2019
      console.log(format2) // 3:43 PM
      

      希望对你有帮助!!!

      【讨论】:

      • 嗨伙计,TLDR,我转换为“MM-DD-YYYY”来获取所选日期的所有数据(如果我不这样做,那么我将只得到某一天的一个数据)然后之后我得到了我想要格式化的所有数据,以便我有时间数据并将其显示给用户。因此我使用了 LT 格式,但它给了我 12:00 AM 的所有数据,但它应该是第一个数据 3:00 AM,第二个数据 6:00 AM 第三个 9:00 AM
      • 应用格式 - moment(item.date).format('..) === selectedDate 在 allDays.filter 中,这样你就不必转换成字符串并且可以在任何地方传递 moment 对象。第二种方法可能是添加解析矩对象的另一个属性。
      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2020-01-16
      相关资源
      最近更新 更多