Как преобразовать метку времени из формата гггг-ММ-ддчч: мм: сс: SSSZ в формат мм / дд / гггг чч: мм: сс.ссс? От ISO8601 до UTC - PullRequest
26 голосов
/ 22 марта 2011

Я хочу преобразовать метку времени 2011-03-10T11: 54: 30.207Z в 03.10.2011 11: 54: 30.207. Как я могу это сделать? Я хочу преобразовать формат ISO8601 в UTC, а затем этот UTC должен быть осведомлен о местоположении. Пожалуйста, помогите

String str_date="2011-03-10T11:54:30.207Z";
DateFormat formatter ;
Date date ;
formatter = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss.SSS");
date = (Date)formatter.parse(str_date);
System.out.println("output: " +date );

Исключение: java.text.ParseException: Неразборчивая дата: "2011-03-10T11: 54: 30.207Z"

Ответы [ 6 ]

31 голосов
/ 22 марта 2011

Во-первых, вы должны знать, что UTC - это не формат, а часовой пояс.Поэтому «преобразование из ISO8601 в UTC» на самом деле не имеет смысла как концепция.

Однако, вот пример программы, использующей Joda Time, которая анализирует текст в DateTime и затем форматирует его.Я догадался в формате , который вы, возможно, захотите использовать - вы на самом деле не предоставили достаточно информации о том, что вы пытаетесь сделать, чтобы сказать больше.Вы также можете рассмотреть часовые пояса ... Вы хотите отобразить местное время в указанный момент времени?Если это так, вам нужно определить часовой пояс пользователя и соответствующим образом преобразовать его.

import org.joda.time.*;
import org.joda.time.format.*;

public class Test {
    public static void main(String[] args) {
        String text = "2011-03-10T11:54:30.207Z";
        DateTimeFormatter parser = ISODateTimeFormat.dateTime();
        DateTime dt = parser.parseDateTime(text);

        DateTimeFormatter formatter = DateTimeFormat.mediumDateTime();
        System.out.println(formatter.print(dt));
    }
}
29 голосов
/ 23 марта 2011

Да. Вы можете использовать SimpleDateFormat следующим образом.

SimpleDateFormat formatter, FORMATTER;
formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String oldDate = "2011-03-10T11:54:30.207Z";
Date date = formatter.parse(oldDate.substring(0, 24));
FORMATTER = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss.SSS");
System.out.println("OldDate-->"+oldDate);
System.out.println("NewDate-->"+FORMATTER.format(date));

Выход OldDate -> 2011-03-10T11: 54: 30.207Z Новая дата -> 10 марта 2011 г. 11: 54: 30.207

0 голосов
/ 23 декабря 2015

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

public String getSystemTimeInBelowFormat() {
    String timestamp = new SimpleDateFormat("yyyy-mm-dd 'T' HH:MM:SS.mmm-HH:SS").format(new Date());
    return timestamp;
}
0 голосов
/ 22 марта 2011

Возможно, вы захотите взглянуть на joda time , который немного проще в использовании, чем инструменты для работы с нативными датами java, и предоставляет множество стандартных шаблонов дат, предварительно созданных.

В ответ на комментарии, более подробно:

Чтобы сделать это, используя время Joda, вам понадобятся два DateTimeFormatters - один для вашего формата ввода для анализа вашего ввода и один для вашего формата вывода для печати вашеговыход.Ваш входной формат является стандартным форматом ISO, поэтому класс ISODateTimeFormat Joda time уже имеет статический метод с парсером для него: dateHourMinuteSecondMillis .Ваш выходной формат не тот, для которого у них есть встроенный форматер, поэтому вам придется создать его самостоятельно, используя DateTimeFormat .Я думаю, что DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS"); должен добиться цели.Если у вас есть два модуля форматирования, вызовите метод parseDateTime() в формате ввода и метод print в формате вывода, чтобы получить результат в виде строки.

Соединение этого должно выглядеть примерно так(предупреждение, не проверено):

DateTimeFormatter input = ISODateTimeFormat.dateHourMinuteSecondMillis();
DateTimeFormatter output = DateTimeFormat.forPattern("mm/dd/yyyy kk:mm:ss.SSS");
String outputFormat = output.print( input.parseDate(inputFormat) );
0 голосов
/ 22 марта 2011

Введите исходную дату в a Date объект , а затем распечатайте результат с помощью a DateFormat.Возможно, вам придется разбить строку на более мелкие части, чтобы создать исходный объект Date, если метод автоматического анализа не принимает ваш формат.

Псевдокод:

Date inputDate = convertYourInputIntoADateInWhateverWayYouPrefer(inputString);
DateFormat outputFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss.SSS");
String outputString = outputFormat.format(inputDate);
0 голосов
/ 22 марта 2011

Использовать DateFormat . (Извините, но краткость вопроса не требует более длинного или более подробного ответа.)

...