как преобразовать строковую дату в формате UT C, используя дату и время - PullRequest
0 голосов
/ 09 апреля 2020
 public static String convertInDateTimeSecondTOJodaTime(String dateTime) {
        try {
            DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
            DateTime date = formatter.parseDateTime(dateTime).withZoneRetainFields(DateTimeZone.UTC);
            return date.toString("h:mm aa");
        } catch (Exception e) {
            return null;
        }
    }

main(){
print(convertInDateTimeSecondTOJodaTime("2020-04-09T07:31:16Z"))
}

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

желаемый результат по лондонскому времени, поэтому в данном случае 8:31.

Ответы [ 4 ]

1 голос
/ 09 апреля 2020
import java.util.Date;
import java.util.TimeZone;
import java.text.SimpleDateFormat;

public class CurrentUtcDate {
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        System.out.println("UTC Time is: " + dateFormat.format(date));
    }
}

Output
UTC Time is: 22-01-2018 13:14:35

Вы можете проверить здесь https://www.quora.com/How-do-I-get-the-current-UTC-date-using-Java

0 голосов
/ 11 апреля 2020

Во-первых, не обрабатывайте дату и время как строки в вашей программе. Обрабатывайте их как правильные объекты даты и времени. Поэтому для всех, кроме самых простых одноразовых программ, вам не нужен метод, который преобразует строку из UT C в строку по лондонскому времени в другом формате.

Поэтому, когда вы принимаете ввод строки разобрать в DateTime объект:

    String stringInput = "2020-04-09T07:31:16Z";
    DateTime dt = DateTime.parse(stringInput);
    System.out.println("Date-time is: " + dt);

Выходные данные:

Дата и время: 2020-04-09T07: 31: 16.000Z

Я использую тот факт, что ваша строка в формате ISO 8601, по умолчанию для Joda-Time, поэтому нам не нужен явный форматер для ее синтаксического анализа.

Не до тех пор, пока вам не потребуется указать строку выведите дату и время в нужную зону и отформатируйте в нужную строку:

    DateTimeZone zone = DateTimeZone.forID("Europe/London");
    DateTime outputDateTime = dt.withZone(zone);
    String output = outputDateTime.toString("h:mm aa");
    System.out.println("Output is: " + output);

Вывод: 8:31

Что пошло не так в Ваш код

  1. Z в одинарных кавычках в строке шаблона формата неверен. Z во входной строке является смещением 0 от UT C и должно быть проанализировано как смещение, иначе вы получите неверный результат. Никогда не ставьте эти кавычки вокруг Z.
  2. withZoneRetainFields() - это неправильный метод для преобразования часовых поясов. Название метода означает, что дата и час дня остаются неизменными, и изменяется только часовой пояс, что обычно приводит к другому моменту времени.

Произошло то, что ваша строка была проанализирована в 2020-04-09T07: 31: 16.000 + 01: 00, это тот же момент времени, что и 06:31:16 UT C, что неправильно. Затем вы заменили часовой пояс на UT C, сохранив время дня 07:31:16. Затем это время было отформатировано и напечатано.

Обдумайте java .time

Как сказал Фабьен, Joda-Time позже заменили на java .time, современный Java API даты и времени. На домашней странице Joda-Time написано:

Обратите внимание, что Joda-Time считается в основном «законченным» проектом. Никаких серьезных улучшений не планируется. Если используется Java SE 8, перейдите на java.time (JSR-310).

Ссылки

0 голосов
/ 09 апреля 2020

Если вы используете Java 8 или новее, вы не должны использовать java .util.Date (устарело) или Joda Time (заменено новым DATE API из Java 8 с пакетом java .time. ):

public static void main(String[] args) {
        String date = "2020-04-09T07:31:16Z";
        String formatedDate = ZonedDateTime.parse(date).format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT));
        System.out.println(formatedDate); //print "7:31 AM"
    }
}
0 голосов
/ 09 апреля 2020

Поскольку вам нужно использовать Joda DateTime, вам необходимо использовать форматтер Joda. Вы возвращаете дату с шаблоном "h: mm aa", поэтому я предполагаю, что вам нужно извлечь время из даты.

Ниже код должен работать:

import java.util.Locale;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class MyDateCoonverter {

    public static void main(String a[]) {

        System.out.println(convertInDateTimeSecondTOJodaTime("2020-04-09T07:31:16Z"));
    }

    public static String convertInDateTimeSecondTOJodaTime(String dateTime) {
            DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
            DateTime dt = formatter.parseDateTime(dateTime);
            return dt.toString("h:mm aa", Locale.ENGLISH);
    }
}

Это дает вывод в виде: 7:31

Если вы не хотите использовать какую-либо стороннюю библиотеку и по-прежнему хотите чтобы извлечь только время из даты, вы можете использовать Java LocalTime.

...