Преобразовать java.util.Date в строку


Answers

Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = formatter.format(date);
Question

Я хочу преобразовать объект java.util.Date в String в Java.

Формат - 2010-05-30 22:15:52




ТЛ; др

myUtilDate.toInstant()  // Convert `java.util.Date` to `Instant`.
          .atOffset( ZoneOffset.UTC )  // Transform `Instant` to `OffsetDateTime`.
          .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a String.
          .replace( "T" , " " )  // Put a SPACE in the middle.

2014-11-14 14:05:09

java.time

Современный способ - это классы java.time, которые теперь вытесняют неприятные старые устаревшие классы времени.

Сначала конвертируйте свой java.util.Date в Instant . Instant класс представляет момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Конверсии в / из java.time выполняются с помощью новых методов, добавленных в старые классы.

Instant instant = myUtilDate.toInstant();

Оба java.util.Date и java.time.Instant находятся в UTC . Если вы хотите видеть дату и время как UTC, пусть будет так. Вызовите toString для генерации строки в стандартном формате ISO 8601 .

String output = instant.toString();  

2014-11-14T14: 05: 09Z

Для других форматов вам необходимо преобразовать Instant в более гибкое OffsetDateTime .

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );

odt.toString (): 2014-11-14T14: 05: 09 + 00: 00

Чтобы получить строку в нужном формате, укажите DateTimeFormatter . Вы можете указать собственный формат. Но я бы использовал один из предопределенных форматировщиков ( ISO_LOCAL_DATE_TIME ) и заменил T на своем выходе пространством.

String output = odt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Кстати, я не рекомендую этот формат, где вы намеренно теряете информацию о offset-from-UTC или часовом поясе. Создает двусмысленность относительно значения значения даты и времени этой строки.

Также остерегайтесь потери данных, так как любая дробная секунда игнорируется (эффективно усечена) в представлении String значения даты.

Чтобы увидеть тот же самый момент через объектив настенных часов определенного региона, примените ZoneId чтобы получить ZonedDateTime .

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2014-11-14T14: 05: 09-05: 00 [Америка / Монреаль]

Чтобы сгенерировать форматированную строку, сделайте то же самое, что и выше, но замените odt на zdt .

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " );

2014-11-14 14:05:09

Если вы выполняете этот код очень много раз, вы можете быть немного более эффективным и избегать вызова String::replace . Удаление этого вызова также делает ваш код короче. Если это необходимо, укажите свой собственный шаблон форматирования в собственном объекте DateTimeFormatter . Кэшируйте этот экземпляр как константу или член для повторного использования.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss" );  // Data-loss: Dropping any fractional second.

Примените этот форматтер, передав экземпляр.

String output = zdt.format( f );

О java.time

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

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

Чтобы узнать больше, ознакомьтесь с учебным пособием Oracle . И поиск для многих примеров и объяснений.

Большая часть функциональных возможностей java.time была перенесена на Java 6 и 7 в ThreeTen-Backport и далее адаптирована для Android в ThreeTenABP (см. Как использовать ... ).

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time.




Почему вы не используете Joda (org.joda.time.DateTime)? Это в основном однострочный.

Date currentDate = GregorianCalendar.getInstance().getTime();
String output = new DateTime( currentDate ).toString("yyyy-MM-dd HH:mm:ss");

// output: 2014-11-14 14:05:09



Если вам нужно только время с даты, вы можете просто использовать функцию String.

Date test = new Date();
String dayString = test.toString();
String timeString = dayString.substring( 11 , 19 );

Это автоматически сократит временную часть String и сохранит ее внутри timeString .




public static void main(String[] args) 
{
    Date d = new Date();
    SimpleDateFormat form = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
    System.out.println(form.format(d));
    String str = form.format(d); // or if you want to save it in String str
    System.out.println(str); // and print after that
}



Попробуй это,

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Date
{
    public static void main(String[] args) 
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = "2013-05-14 17:07:21";
        try
        {
           java.util.Date dt = sdf.parse(strDate);         
           System.out.println(sdf.format(dt));
        }
        catch (ParseException pe)
        {
            pe.printStackTrace();
        }
    }
}

Вывод:

2013-05-14 17:07:21

Подробнее о форматировании даты и времени в java см. Ссылки ниже

Справочный центр Oracle

Пример времени в java




public static String formateDate(String dateString) {
    Date date;
    String formattedDate = "";
    try {
        date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",Locale.getDefault()).parse(dateString);
        formattedDate = new SimpleDateFormat("dd/MM/yyyy",Locale.getDefault()).format(date);
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return formattedDate;
}