Как конвертировать currentTimeMillis в дату в Java?



у меня есть миллисекунды в определенном файле журнала, сгенерированном на сервере, я также знаю локаль, из которой был сгенерирован файл журнала, моя проблема заключается в преобразовании миллисекунд в дату в указанном формате.
Обработка этого журнала происходит на сервере, расположенном в другом часовом поясе. При преобразовании в" SimpleDateFormat " программа принимает дату машины, поскольку такая форматированная дата не представляет правильного времени сервера. Есть ли способ справиться с этим элегантно ?



long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);

System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));

DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");

System.out.println("jodaTime "+parser1.print(jodaTime));


выход:



Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
929   10  

10 ответов:

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timeStamp);

int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);

вы можете использовать java.util.Date класса, а затем использовать SimpleDateFormat в формате Date.

Date date=new Date(millis);

tl; dr

Instant.ofEpochMilli( 1_322_018_752_992L )     // Parse count of milliseconds-since-start-of-1970-UTC into an `Instant`.
       .atZone( ZoneId.of( "Africa/Tunis" ) )  // Assign a time zone to the `Instant` to produce a `ZonedDateTime` object.

подробности

другие ответы используют устаревшие или неправильные классы.

избегайте старых классов даты и времени, таких как java.утиль.Дата./Календарь. Они оказались плохо спроектированными, запутанными и хлопотными.

java.время

The java.время фреймворк встроен в Java 8 и более поздние версии. Большая часть функциональности backported to Java 6 & 7 и далее адаптирован к Android. Сделано некоторыми из тех же людей, которые сделали Joda Времени.

An Instant момент на временной шкале в UTC с разрешением наносекунд. Его эпохи это первый момент 1970 года в UTC.

предполагая, что входные данные-это количество миллисекунд с 1970-01-01T00:00:00Z (не понятно в вопросе), то мы можем легко создавать Instant.

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );

мгновенный.toString (): 2011-11-23T03:25: 52.992 Z

The Z в этом стандарте ISO 8601 форматированная строка-это сокращение от Zulu и означает UTC.

применить часовой пояс с помощью правильное название часового пояса, чтобы получить ZonedDateTime.

ZoneId zoneId = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( zoneId );

посмотреть этот code run live at IdeOne.com.

Asia/Kolkata время зона ?

я предполагаю, что у вас был часовой пояс Индии, влияющий на ваш код. Мы видим здесь, что настройка в Asia/Kolkata часовой пояс отображает то же время суток, как вы сообщаете,08:55 что на пять с половиной часов опережает наше значение UTC 03:25.

2011-11-23T08:55:52.992+05:30[Азия/Калькутта]

зоны по умолчанию

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

ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

о java.время

The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие дата и время занятия как java.util.Date,Calendar,& SimpleDateFormat.

The Joda-Time, теперь режим обслуживания, советует миграция в java.время классы.

дополнительные сведения см. В разделе элемент Учебник Oracle. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.

С - драйвера соответствии с JDBC 4.2 или позже вы можете обменять java.время объекты непосредственно с вашей базой данных. Нет необходимости в строках или java.язык SQL.* учебные занятия.

где получить java.время занятий?

  • Java SE 8, Java SE 9, и позже
    • встроенный.
    • часть стандартного Java API с комплектной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • большая часть java.функциональность время портированы с Java 6 и 7 в ThreeTen-Backport.
  • Android
    • более поздние версии Android bundle реализации java.время занятий.
    • для более ранних Android, ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....

The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как Interval,YearWeek,YearQuarter и больше.

Если значение millis-это число миллисов с 1 января 1970 года по Гринвичу, как это стандартно для JVM, то это не зависит от часового пояса. Если вы хотите отформатировать его с определенным часовым поясом, вы можете просто преобразовать его в объект gregoriancalendar и установить часовой пояс. После этого есть множество способов его форматирования.

самый простой способ сделать это-использовать Joda DateTime class и укажите как метку времени в миллисекундах, так и нужный вам часовой пояс.

Я настоятельно рекомендую избегать встроенных классов даты и календаря Java; они ужасны.

Мое Решение

public class CalendarUtils {

    public static String dateFormat = "dd-MM-yyyy hh:mm";
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);

    public static String ConvertMilliSecondsToFormattedDate(String milliSeconds){
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(Long.parseLong(milliSeconds));
        return simpleDateFormat.format(calendar.getTime());
    }
}

класс SimpleDateFormat имеет метод SetTimeZone (часовой пояс), который наследуется от класса DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html

самый простой способ:

private String millisToDate(long millis){

    return DateFormat.getDateInstance(DateFormat.SHORT).format(millis);
    //You can use DateFormat.LONG instead of SHORT

}

Я делаю это так:

static String formatDate(long dateInMillis) {
    Date date = new Date(dateInMillis);
    return DateFormat.getDateInstance().format(date);
}

вы также можете использовать getDateInstance(int style) со следующими параметрами:

DateFormat.SHORT

DateFormat.MEDIUM

DateFormat.LONG

DateFormat.FULL

DateFormat.DEFAULT

ниже мое решение, чтобы получить дату от милисекунд до формата даты. Вы должны использовать Библиотека Джода чтобы запустить этот код.

import java.util.GregorianCalendar;
import java.util.TimeZone;

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

public class time {

    public static void main(String args[]){

        String str = "1431601084000";
        long geTime= Long.parseLong(str);
        GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
        calendar.setTimeInMillis(geTime);
        DateTime jodaTime = new DateTime(geTime, 
               DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
        DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd");
        System.out.println("Get Time : "+parser1.print(jodaTime));

   }
}

Comments

    Ничего не найдено.