Недопустимый символ образца 'T' при парсинге строки даты к java.util. Дата

Самый простой способ написать это - использовать цикл for внутри функции async. Обещайте getFile, чтобы он возвращал Promise, а затем ожидайте его на каждой итерации цикла. В конце цикла вызовите обратный вызов:

const getFileProm = file => new Promise((resolve, reject) => {
  getFile(file, (err, fileName) => {
    if (err) reject(err);
    else resolve(fileName);
  });
});

async function fetchContentOfFiles(fileNames, testCB) {
  const fileContent = [];
  try {
    for (let i = 0; i < fileNames.length; i++) {
      fileContent.push(
        await getFileProm(fileNames[i])
      );
    }
  } catch(e) {
    // handle errors, if you want, maybe call testCB with an error and return?
  }
  testCB(null, fileContent);
}

Вероятно, было бы даже лучше, если бы fetchContentOfFiles вызывался и обрабатывался как Обещание , а не с обратными вызовами, а затем ошибки могут быть обработаны потребителем:

async function fetchContentOfFiles(fileNames) {
  const fileContent = [];
  for (let i = 0; i < fileNames.length; i++) {
    fileContent.push(
      await getFileProm(fileNames[i])
    );
  }
  return fileContent;
}

fetchContentOfFiles(arr)
  .then((fileContent) => {
    // do stuff with fileContent
  })
  .catch((err) => {
    // something went wrong
  });
164
задан hguser 6 October 2016 в 23:56
поделиться

2 ответа

Обновление для Java 8 и выше

Теперь вы можете просто сделать Instant.parse ("2015-04-28T14: 23: 38.521Z") и получите правильную вещь сейчас, тем более что вы должны использовать Instant вместо сломанного java.util .Дата с самыми последними версиями Java.

Вы также должны использовать DateTimeFormatter вместо SimpleDateFormatter .

Исходный ответ:

Приведенное ниже объяснение по-прежнему актуально, как и то, что представляет собой формат. Но оно было написано до того, как Java 8 стала повсеместной, поэтому в нем используются старые классы , которые вам следует не использовать, если вы используете Java 8 или выше.

Это работает со входом с замыкающим Z , как показано:

В шаблоне T экранируется с помощью ' с обеих сторон.

Шаблон для Z в конце на самом деле XXX , как описано в JavaDoc для SimpleDateFormat , это просто не очень очистите , как его использовать, поскольку Z также является маркером для старой информации TimeZone .

Q2597083.java

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

public class Q2597083
{
    /**
     * All Dates are normalized to UTC, it is up the client code to convert to the appropriate TimeZone.
     */
    public static final TimeZone UTC;

    /**
     * @see <a href="http://en.wikipedia.org/wiki/ISO_8601#Combined_date_and_time_representations">Combined Date and Time Representations</a>
     */
    public static final String ISO_8601_24H_FULL_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";

    /**
     * 0001-01-01T00:00:00.000Z
     */
    public static final Date BEGINNING_OF_TIME;

    /**
     * 292278994-08-17T07:12:55.807Z
     */
    public static final Date END_OF_TIME;

    static
    {
        UTC = TimeZone.getTimeZone("UTC");
        TimeZone.setDefault(UTC);
        final Calendar c = new GregorianCalendar(UTC);
        c.set(1, 0, 1, 0, 0, 0);
        c.set(Calendar.MILLISECOND, 0);
        BEGINNING_OF_TIME = c.getTime();
        c.setTime(new Date(Long.MAX_VALUE));
        END_OF_TIME = c.getTime();
    }

    public static void main(String[] args) throws Exception
    {

        final SimpleDateFormat sdf = new SimpleDateFormat(ISO_8601_24H_FULL_FORMAT);
        sdf.setTimeZone(UTC);
        System.out.println("sdf.format(BEGINNING_OF_TIME) = " + sdf.format(BEGINNING_OF_TIME));
        System.out.println("sdf.format(END_OF_TIME) = " + sdf.format(END_OF_TIME));
        System.out.println("sdf.format(new Date()) = " + sdf.format(new Date()));
        System.out.println("sdf.parse(\"2015-04-28T14:23:38.521Z\") = " + sdf.parse("2015-04-28T14:23:38.521Z"));
        System.out.println("sdf.parse(\"0001-01-01T00:00:00.000Z\") = " + sdf.parse("0001-01-01T00:00:00.000Z"));
        System.out.println("sdf.parse(\"292278994-08-17T07:12:55.807Z\") = " + sdf.parse("292278994-08-17T07:12:55.807Z"));
    }
}

Производит следующий вывод:

sdf.format(BEGINNING_OF_TIME) = 0001-01-01T00:00:00.000Z
sdf.format(END_OF_TIME) = 292278994-08-17T07:12:55.807Z
sdf.format(new Date()) = 2015-04-28T14:38:25.956Z
sdf.parse("2015-04-28T14:23:38.521Z") = Tue Apr 28 14:23:38 UTC 2015
sdf.parse("0001-01-01T00:00:00.000Z") = Sat Jan 01 00:00:00 UTC 1
sdf.parse("292278994-08-17T07:12:55.807Z") = Sun Aug 17 07:12:55 UTC 292278994
190
ответ дан 23 November 2019 в 21:14
поделиться

Существует два ответа выше до сих пор, и они и долго (и tl; доктор слишком короткий, по моему скромному мнению), таким образом, я пишу сводку из своего опыта, начинающего использовать новый библиотека java.time (применимый, как отмечено в других ответах на версию 8 Java +). ISO 8601 устанавливает стандартный способ записать даты: YYYY-MM-DD, таким образом, формат даты и времени только как ниже (мог быть 0, 3, 6 или 9 цифр для миллисекунд), и никакая необходимая строка форматирования:

import java.time.Instant;
public static void main(String[] args) {
    String date="2010-10-02T12:23:23Z";
    try {
        Instant myDate = Instant.parse(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

мне не был нужен он, но как получение года находится в коде от вопроса, затем:
это более хитро, не может быть сделан от Instant непосредственно, может быть сделан через Calendar способом вопросов , Получают целочисленное значение текущего года в Java и Преобразование java.time к Календарю , но по моему скромному мнению поскольку формат является исправленной подстрокой, больше прост в использовании:

myDate.toString().substring(0,4);
0
ответ дан 23 November 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: