Преобразовать миллисекунды в григорианский календарь

Я хочу преобразовать миллисекунды в длинном формате в григорианский календарь. При поиске в Интернете я использую следующий код:

public static String getStringDate(int julianDate){
    GregorianCalendar gCal = new GregorianCalendar();
    Time gTime = new Time();
    gTime.setJulianDay(julianDate);
    gCal.setTimeInMillis(gTime.toMillis(false));
    String gString = Utils.getdf().format(gCal.getTime());
    return gString;
}

public static SimpleDateFormat getdf(){
    return new SimpleDateFormat("yyyy-MM-dd, HH:MM",Locale.US);
}

Да, код работает, но я обнаружил, что только дата и час правильные, но есть ошибки в минутах. Скажем, если это произойдет 06.11.2014, 14:00, это даст мне 06.11.2014, 14:11. Я хочу знать, есть ли какие-либо решения для его изменения или не рекомендуется преобразовывать время в григорианский календарь. Большое спасибо!


person Antoine Murion    schedule 07.11.2014    source источник


Ответы (2)


Проблема на самом деле очень проста, измените SimpleDateFormat("yyyy-MM-dd, HH:MM",Locale.US) с помощью

SimpleDateFormat("гггг-ММ-дд, ЧЧ:мм",Locale.getDefault());

решит проблему

person Antoine Murion    schedule 12.11.2014
comment
К вашему сведению, проблемные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь унаследованы, вытеснены java.time. Большая часть функций java.time обратно портирована на Java 6 и Java 7 в Проект ThreeTen-Backport. Дальнейшая адаптация для более ранней версии Android в ThreeTenABP проект. См. Как использовать ThreeTenABP…. - person Basil Bourque; 01.02.2018

tl;dr

Instant.ofEpochMilli( millis )                  // Convert count-from-epoch into a `Instant` object for a moment in UTC.
    .atZone( ZoneId.of( "Pacific/Auckland" ) )  // Adjust from UTC to a particular time zone. Same moment, different wall-clock time. Renders a `ZonedDateTime` object.
    .format(                                    // Generate a String in a particular format to represent the value of our `ZonedDateTime` object.
        DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd, HH:mm" )
    )

Java.время

Современный подход использует классы java.time вместо проблемных устаревших классов.

Преобразуйте количество миллисекунд с момента ссылки на эпоху первого момента 1970 года (1970-01-01T00:00Z) в объект Instant. Имейте в виду, что Instant способен к более тонкой детализации наносекунд.

Instant instant = Instant.ofEpochMilli( millis ) ;

Этот момент находится в UTC. Чтобы настроиться на другой часовой пояс, примените ZoneId, чтобы получить ZonedDateTime.

Часовой пояс имеет решающее значение при определении даты. В любой момент дата варьируется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париже, Франция наступает новый день, хотя " вчера» в Монреаль, Квебек.

Если часовой пояс не указан, JVM неявно применяет свой текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться. Лучше указать желаемый/ожидаемый часовой пояс явно в качестве аргумента.

Укажите правильное название часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте сокращения из 3-4 букв, такие как EST или IST, так как они не являются часовыми поясами, не стандартизированы и даже не уникальны(!).

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

Сгенерируйте строку в желаемом формате, используя объект DateTimeFormatter.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd, HH:mm" , Locale.US ) ;
String output = zdt.format( f ) ;

О java.time

java.time встроена в Java 8 и более поздние версии. Эти классы заменяют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь в режим обслуживания, советует перейти на java.time.

Чтобы узнать больше, см. Учебное пособие по Oracle. И поищите множество примеров и пояснений в Stack Overflow. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, and later
    • Built-in.
    • Часть стандартного Java API со встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 and Java SE 7
    • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
person Basil Bourque    schedule 01.02.2018