InvalidPipeArgument: «Невозможно преобразовать «2018-01-01-12:12:12:123456» в дату» для канала «DatePipe»

 <td>{{suite.testSuiteAttributes && 
       suite.testSuiteAttributes.modifiedTimestamp | date: 'yyyy-MM-dd'
     }}
</td>

Я хочу, чтобы формат даты был в формате CST «05 февраля 2018 г., 23:00:00 по центральному поясному времени». Но получаю сообщение об ошибке:

Unable to convert "2018-01-01-12:12:12:123456" into a date' for pipe 'DatePipe

Я думаю, это связано с тем, что timeStamp не в формате даты ... но получает только эту дату из бэкэнда. Пожалуйста, предложите.

Вы должны преобразовать значение в Date, где вы получите их из бэкэнда, или написать Pipe, который будет преобразовывать это для вас.

Hakier 11.03.2019 10:14

Вы пытаетесь объединить тексты?

rcanpahali 11.03.2019 10:14

@Hakier, хорошо, я попробую использовать метод трубы

sm770 11.03.2019 10:18

@shadowman_93 no.. использование && для обработки нулевых значений в массиве

sm770 11.03.2019 10:19

modifiedTimestamp будет вашей датой, верно?

TheParam 11.03.2019 10:20

@TheParam да, это дата.. вот так.. 2018-01-01-12:12:12:123456”

sm770 11.03.2019 10:22

дата, которую вы пытаетесь проанализировать, является недопустимой датой

TheParam 11.03.2019 10:32

@TheParam, как его можно преобразовать в действительную дату ??

sm770 11.03.2019 10:34

напишите, что вам нужно написать собственный синтаксический анализатор или попросить бэкэнд команды предоставить действительную метку времени

TheParam 11.03.2019 10:40

Я написал для вас простой парсер, пожалуйста, проверьте ответ

TheParam 11.03.2019 10:54
Затем исправьте свой бэкэнд, чтобы указать действительную дату.
Ian Kemp 11.03.2019 11:23

@IanKemp .. спасибо .. как только я получу действительную дату, как я могу преобразовать ее в часовой пояс CT ??

sm770 11.03.2019 11:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
12
19 676
2

Ответы 2

Я думаю, что вы получаете неправильную дату формата с сервера. Вам нужна дата в допустимом формате, чтобы преобразовать ее

Итак, вот обходное решение вашей проблемы, где я написал метод myDateParser() для преобразования вашей недействительной даты в действительную дату.

ваш.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  modifiedTimestamp;

 constructor(){

   // Passing unformatter date
   this.modifiedTimestamp = this.myDateParser('2018-01-01-12:12:12:123456');
 }

 /**
  * Custom Date parser

  */
  myDateParser(dateStr : string) : string {
    // 2018-01-01T12:12:12.123456; - converting valid date format like this

    let date = dateStr.substring(0, 10);
    let time = dateStr.substring(11, 19);
    let millisecond = dateStr.substring(20)

    let validDate = date + 'T' + time + '.' + millisecond;
    console.info(validDate)
    return validDate
  }
}

ваш.component.html

  <table>
    <tr>
     <td>{{modifiedTimestamp |  date: 'yyyy-MM-dd'}}</td>
    </tr>
   </table>

Решение на stackblitz

Надеюсь, это поможет!

Что {{suite.testSuiteAttributes && suite.testSuiteAttributes.modifiedTimestamp.toDate() | date: 'yyyy-MM-dd'}} делает? Он собирается вернуть логическое типизированное значение.

rcanpahali 11.03.2019 10:18

приятель, он просто проверяет, что testSuiteAttributes имеет значение null или нет, прежде чем обращаться к модифицированной временной метке

TheParam 11.03.2019 10:21

@TheParam Большое спасибо, приятель ... как я могу написать это в формате CT timeZOne, а также в формате Am / PM?

sm770 11.03.2019 10:50

@TheParam, если я изменю {{modifiedTimestamp | date: 'dd-MMM-yyyy hh:mm:ss.sss}} дата выглядит как 2018/01/01 12:12:12.1212...1212 верно? значит, мы можем иметь 4 цифры в миллисекундах?

sm770 11.03.2019 11:03

да дата имеет только 3 миллисекунды, поэтому вы можете отказаться от последних значений

TheParam 11.03.2019 13:51

{{modifiedTimestamp | date: 'yyyy-MM-dd h:mm a': 'CST'}} сделайте что-нибудь вроде, проверьте обновленный пример stackblitz

TheParam 11.03.2019 13:55

Как насчет добавления Z в конце новой строки даты? Хотя без него работает.

testing 22.01.2020 14:15

Ваша дата "2018-01-01-12:12:12:123456" не является допустимым Дата ISO 8601, поэтому ее нельзя проанализировать встроенным парсером. Либо используйте допустимый формат даты, либо напишите собственный синтаксический анализатор.

Вы можете использовать регулярное выражение или просто использовать строковые функции, такие как подстрока, как показано в другом ответе.

Даты в Javascript будут в локальном часовом поясе браузера, который является системным временем пользователя, нет собственного способа создать дату в другом часовом поясе. Вы можете создать дату в формате UTC и использовать toLocaleString() для преобразования ее в определенный часовой пояс. Зависит от того, находится ли дата, отправленная из бэкэнда, в формате UTC или CT. Если это CT, то это будет работать только для пользователей в часовом поясе CT.

let result = "2018-01-01-12:12:12:123456".match(/(\d{4})-(\d{2})-(\d{2})-(\d{2}):(\d{2}):(\d{2}):(\d{3})/).map(x => parseInt(x, 10));

result.shift();

console.info(new Date(...result).toLocaleString())

... это дата, которую я получаю от бэкэнда... так что ничего не могу с этим поделать... не могли бы вы немного рассказать мне о написании пользовательского синтаксического анализатора.

sm770 11.03.2019 10:33

Да, но можете ли вы объяснить, что здесь представляют 123456? миллисекундная часть может иметь максимум 3 символа. hh:mm:ss.sss. Не существует понятия миллисекунды больше 999.

sabithpocker 11.03.2019 10:35

это фиктивные данные, которые также могут быть неверными, пожалуйста, помогите с содержимым парсера, учитывая, что для его получения требуется всего три цифры, например, 05 февраля 2018 г., 23:00:00 по центральному поясному времени.

sm770 11.03.2019 10:40

Другие вопросы по теме