日期以奇怪的方式显示 angular 6

dates are displaying in weird way angular 6

我在angular中有应用程序用户可以输入评论,评论会自动显示并显示添加日期,奇怪的部分如下

  1. 当用户在此处输入评论时显示的内容(检查时间)

第一条评论是昨天的,第二条评论是新的,你提交后能看到一个小时前的日期而不是现在吗? .

  1. 当用户刷新浏览器时,这里显示的是查看置顶评论时间?

我要的是旧评论在上,新评论在下 并且新评论现在应该有时间,而不是刷新后

这是我的解决方案,注意我的日期格式是 momet js

在 ts 中添加和获取评论的功能

// get all comments
    this.activeRouter.params.subscribe((params) => {
        const id = params['id'];
        this.userService.getComments(id)
        .pipe(
          map(data => data.sort((a, b) => new Date(b.localTime).getTime() - new Date(a.localTime).getTime()))
        )
        .subscribe(data => this.comments = data);
     });
  }

// add comments to server
  addComments(task_id) {
    const formData = this.addForm.value;
    formData.task_id = task_id;
    this.userService.addComments(formData)
    .subscribe(data => {
      this.comments.push(this.addForm.value);
      this.addForm.reset();
    });
  // grab localtime
    const date = new Date();
    const d = date.getUTCDate();
    const day = (d < 10) ? '0' + d : d;
    const m = date.getUTCMonth() + 1;
    const month = (m < 10) ? '0' + m : m;
    const year = date.getUTCFullYear();
    const h = date.getUTCHours();
    const hour = (h < 10) ? '0' + h : h;
    const mi = date.getUTCMinutes();
    const minute = (mi < 10) ? '0' + mi : mi;
    const sc = date.getUTCSeconds();
    const second = (sc < 10) ? '0' + sc : sc;
    const loctime = `${year}-${month}-${day}T${hour}`;

    this. addForm.get('localTime').setValue(loctime);

  }

这里有服务

  // add comments
  addComments(comments: Comment) {
    comments.localTime = new Date();
    return this.http.post(this.commentsUrl, comments);
  }

  // get comments
  getComments(id: number): Observable<any> {
    return this.http.get(this.commentsUrl).pipe(
      map(this.extractData),
      catchError(this.handleError));
  }

json 文件看起来如何

  "comment": [
    {
      "id": 1,
      "localTime": "2018-10-29T23:12:57.129Z",
      "description": "Putin is Dope\n"
    },
    {
      "id": 2,
      "localTime": "2018-10-29T23:13:25.743Z",
      "description": "Obama is cool \n"
    },
  {
      "id": 2,
      "localTime": "2018-10-29T23:13:25.743Z",
      "description": "No No do U know JOHN POMBE MAGUFULI? the president of Tanzania oooh oooh man he is savage , they call him Buldoser, Moderator please change the title "Who is the weakest president of all time?" => OBAMA  \n"
    }

  ]
}

这里是HTML

 <span class="days">{{comment.localTime | amTimeAgo}}</span>

注意:要获取那些时间前、时间前等,我使用管道:https://www.npmjs.com/package/time-ago-pipe

我的代码哪里做错了????谢谢

那是因为您发送到服务器并立即使用的值不同。请注意,您直接使用 loctime 变量,它在一些转换后保存一个值,但您只向服务器发送一个 new Date()。这里我记录了这两个值,注意区别:

const date = new Date();
const d = date.getUTCDate();
const day = (d < 10) ? '0' + d : d;
const m = date.getUTCMonth() + 1;
const month = (m < 10) ? '0' + m : m;
const year = date.getUTCFullYear();
const h = date.getUTCHours();
const hour = (h < 10) ? '0' + h : h;
const mi = date.getUTCMinutes();
const minute = (mi < 10) ? '0' + mi : mi;
const sc = date.getUTCSeconds();
const second = (sc < 10) ? '0' + sc : sc;
const loctime = `${year}-${month}-${day}T${hour}`;

console.log('date:', date);
console.log('loctime:', loctime);
console.log('typeof date:', typeof date);
console.log('typeof loctime:', typeof loctime);

docs 中所述,此管道与常规 Date 一起工作,您可以使用 new Date() 命令获得它,最后您可以简单地执行此操作:

this.addForm.get('localTime').setValue(new Date());

this.addForm.get('localTime').setValue(date);

因为您已经将此值存储到 date 变量中。

关于顺序:

顺序,当你从服务器获取评论时,当你只是添加新评论而不从服务器获取列表时不同,因为只有当你从服务器获取评论列表时才使用排序管道。我是说这部分:

this.userService.getComments(id)
  .pipe(
    map(data => data.sort((a, b) => new Date(b.localTime).getTime() - new Date(a.localTime).getTime()))
  )

要解决这个问题,您可以在将评论发布到服务器后对评论进行排序,但我认为最简单的方法就是使用 .unshift() instead of .push(),如下所示:

this.userService.addComments(formData)
  .subscribe(data => {
    this.comments.unshift(this.addForm.value);
    this.addForm.reset();
  });

但这只有在渲染之前没有对这些数据进行任何额外的转换时才有效,例如,HTML.

中的管道