Как отформатировать временную метку java.sql для отображения?

Как мне отформатировать временную метку java.sql по своему вкусу? (к строке для отображения)


person nos    schedule 20.07.2009    source источник


Ответы (7)


java.sql.Timestamp расширяет java.util.Date. Ты можешь сделать:

String s = new SimpleDateFormat("MM/dd/yyyy").format(myTimestamp);

Или также включить время:

String s = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(myTimestamp);
person ChssPly76    schedule 20.07.2009
comment
Это сработает, но будьте осторожны, так как SimpleDateFormat не является потокобезопасным. - person Brian Agnew; 21.07.2009
comment
Просто небольшое напоминание о том, что если объект SimpleDateFormat является объектом с локальной областью (он создается и используется только внутри метода), то он потокобезопасен, поскольку стек, в котором он будет находиться, по своей сути потокобезопасен (поскольку он принадлежит одна нить). - person quantum; 13.09.2011
comment
Чтобы включить время, вам нужно будет использовать SimpleDateFormat (MM/dd/yyyy hh:mm) или что-то подобное - person AverageMarcus; 26.07.2012
comment
чтобы сделать его полным для тех, кому это нужно, String S = new SimpleDateFormat(MM/dd/yyyy HH:mm:ss).format(myTimestamp); - person Ishan Liyanage; 03.10.2013

Используйте String.format (или java.util.Formatter):

Timestamp timestamp = ...
String.format("%1$TD %1$TT", timestamp)

EDIT:
см. документацию Formatter, чтобы узнать, что означают TD и TT: нажмите
java.util.Formatter

Первая буква «Т» означает:

't', 'T'    date/time   Prefix for date and time conversion characters.

и символ, следующий за этой буквой «Т»:

'T'     Time formatted for the 24-hour clock as "%tH:%tM:%tS".
'D'     Date formatted as "%tm/%td/%ty". 
person user85421    schedule 21.07.2009
comment
Это лучший ответ, как по мне. Никакой лишний объект не создается только для преобразования временной метки в строку. - person Salil; 25.05.2013
comment
Теперь должно быть понятно, где найти документацию и что она означает - person user85421; 05.11.2013
comment
Очень элегантный. Просто для ясности: форматирование, созданное в этом примере, выглядит как 05/30/17 00:39:18. - person Noumenon; 30.05.2017
comment
@Noumenon спасибо, это был формат, который мне понравился, как того требовал вопрос [:-) - person user85421; 30.05.2017

Для этого конкретного вопроса стандартное предложение java.text.SimpleDateFormat работает, но имеет неприятный побочный эффект, заключающийся в том, что SimpleDateFormat не является потокобезопасным и может быть источником особенно неприятных проблем, поскольку искажает выходные данные в многопоточных сценариях, и вы не будет никаких исключений!

Я бы настоятельно рекомендовал искать что-то подобное на Joda. Почему ? Это гораздо более богатая и интуитивно понятная библиотека времени/даты для Java, чем текущая библиотека (и основа многообещающей новой стандартной библиотеки даты/времени Java, так что вы скоро изучите стандартную библиотеку). API).

person Brian Agnew    schedule 21.07.2009
comment
Хорошее предупреждение. Но очень легко решить - не делитесь экземплярами SimpleDateFormat, сохраняя их в области сеанса/переменных экземпляра/статическом контексте, а затем получая к ним доступ из нескольких потоков. Просто создайте новый SimpleDateFormat() в своем методе и выбросьте его после использования. Это потокобезопасно. - person Glen Best; 24.04.2013
comment
Конечно, если вы действительно хотите сохранить/поделиться экземпляром SimpleDateFormat, синхронизируйте доступ: synchronized(simpleDateFormatInstance) {s = simpleDateFormatInstance.format(myTimeStamp)} ИЛИ создайте пользовательское расширение класса SDF и сделайте это автоматически в методе форматирования. - person Glen Best; 24.04.2013

Если вы используете MySQL и хотите, чтобы сама база данных выполняла преобразование, используйте это:

DATE_FORMAT(дата,формат)< /а>

Если вы предпочитаете форматировать с помощью Java, используйте это:

java.text.SimpleDateFormat

SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy");
dateFormat.format( new Date() );
person DreadPirateShawn    schedule 20.07.2009

Используйте DateFormat. В интернационализированном приложении используйте формат, предоставленный getInstance. Если вы хотите явно управлять форматом, создайте новый SimpleDateFormat самостоятельно.

person erickson    schedule 20.07.2009

Java.время

Я даю современный ответ. Класс Timestamp представляет собой хак поверх уже плохо спроектированного класса java.util.Date и давно устарел. Однако я предполагаю, что вы получаете Timestamp из устаревшего API, который вы не можете позволить себе обновить до java.time прямо сейчас. Когда вы это сделаете, преобразуйте его в современный Instant и выполните дальнейшую обработку оттуда.

    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.GERMAN);
    
    Timestamp oldfashionedTimestamp = new Timestamp(1_567_890_123_456L);
    
    ZonedDateTime dateTime = oldfashionedTimestamp.toInstant()
            .atZone(ZoneId.systemDefault());
    String desiredFormat = dateTime.format(formatter);
    
    System.out.println(desiredFormat);

Вывод в моем часовом поясе:

07.09.2019 23:02:03

Выберите, насколько длинный или короткий формат вы хотите, указав FormatStyle.SHORT, .MEDIUM, .LONG или .FULL. Выберите свою собственную локаль, где я поставил Locale.GERMAN. И выберите нужный часовой пояс, например ZoneId.of("Europe/Oslo"). Timestamp — это момент времени без часового пояса, поэтому нам нужен часовой пояс, чтобы иметь возможность преобразовать его в год, месяц, день, час, минуту и ​​т. д. Если ваш Timestamp исходит из значения базы данных типа timestamp без часового пояса (обычно не рекомендуется, но, к сожалению, часто встречается), ZoneId.systemDefault(), скорее всего, даст вам правильный результат. Другой и немного более простой вариант в этом случае - вместо этого преобразовать в LocalDateTime, используя oldfashionedTimestamp.toLocalDateTime(), а затем отформатировать LocalDateTime так же, как я сделал с ZonedDateTime.

person Ole V.V.    schedule 09.09.2020

Строка timeFrSSHStr = timeFrSSH.toString();

person 1909    schedule 15.08.2012