Подтвердить что ты не робот

Как преобразовать 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
4b9b3361

Ответ 1

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);

Ответ 2

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

Date date=new Date(millis);

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Избегайте старых классов времени, таких как java.util.Date/.Calendar. Они оказались плохо спроектированными, запутанными и неприятными.

java.time

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

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

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

Instant instant = Instant.ofEpochMilli( 1_322_018_752_992L );

instant.toString(): 2011-11-23T03: 25: 52.992Z

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

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

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

Смотрите этот запуск кода на IdeOne.com.

Asia/Kolkata часовой пояс?

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

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

По умолчанию зона

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

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

Ответ 6

Мое решение

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());
    }
}

Ответ 8

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

private String millisToDate(long millis){

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

}

Ответ 9

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

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

Ответ 10

Ниже представлено мое решение для получения даты от формата miliseconds до даты. Вы должны использовать Joda Library, чтобы запустить этот код.

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));

   }
}