хотите текущую дату и время в формате "дд / мм / гггг чч: мм: сс.сс" - PullRequest
17 голосов
/ 05 января 2012

Я использую следующий код для получения даты в формате "дд / мм / гггг ЧЧ: мм: сс.СС".

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;

    public class DateAndTime{

    public static void main(String[] args)throws Exception{

    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS");
    String strDate = sdf.format(cal.getTime());
    System.out.println("Current date in String Format: "+strDate);

    SimpleDateFormat sdf1 = new SimpleDateFormat();
    sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");
    Date date = sdf1.parse(strDate);
    System.out.println("Current date in Date Format: "+date);

}
}

и получаю следующий вывод

    Current date in String Format: 05/01/2012 21:10:17.287
    Current date in Date Format: Thu Jan 05 21:10:17 IST 2012

Просьба предложить, что я должен сделать, чтобы отобразить дату в том же строковом формате (дд / мм / гггг ЧЧ: мм: сс.СС), т.е. я хочу следующий вывод:

    Current date in String Format: 05/01/2012 21:10:17.287
    Current date in Date Format: 05/01/2012 21:10:17.287

Просьба предложить

Ответы [ 7 ]

17 голосов
/ 28 сентября 2013

SimpleDateFormat

sdf=new SimpleDateFormat("dd/MM/YYYY hh:mm:ss");
String dateString=sdf.format(date);

Он выдаст 28/09/2013 09:57:19, как вы ожидаете.

Для полной программы нажмите здесь

15 голосов
/ 05 января 2012

Вы не можете - потому что вы звоните Date.toString(), что будет всегда включать часовой пояс системы, если это в формате даты по умолчанию для локали по умолчанию. Само значение Date не имеет понятия о формате. Если вы хотите отформатировать его особым образом, используйте SimpleDateFormat.format() ... использование Date.toString() почти всегда является плохой идеей.

12 голосов
/ 05 января 2012

Следующий код дает ожидаемый результат. Вы этого хотите?

import java.util.Calendar;
import java.util.Date;

public class DateAndTime {

    public static void main(String[] args) throws Exception {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss.SS");
        String strDate = sdf.format(cal.getTime());
        System.out.println("Current date in String Format: " + strDate);

        SimpleDateFormat sdf1 = new SimpleDateFormat();
        sdf1.applyPattern("dd/MM/yyyy HH:mm:ss.SS");
        Date date = sdf1.parse(strDate);
        String string=sdf1.format(date);
        System.out.println("Current date in Date Format: " + string);

    }
}
3 голосов
/ 05 января 2012

Использование:

 System.out.println("Current date in Date Format: " + sdf.format(date));
1 голос
/ 13 сентября 2018

tl; dr

  • Используйте современные java.time классы.
  • Никогда не используйте Date / Calendar / SimpleDateFormat классов.

Пример:

ZonedDateTime                                // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone).
.now(                                        // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )              // Always specify time zone using proper `Continent/Region` format. Never use 3-4 letter pseudo-zones such as EST, PDT, IST, etc.
)
.truncatedTo(                                // Lop off finer part of this value.
    ChronoUnit.MILLIS                        // Specify level of truncation via `ChronoUnit` enum object.
)                                            // Returns another separate `ZonedDateTime` object, per immutable objects pattern, rather than alter (“mutate”) the original.
.format(                                     // Generate a `String` object with text representing the value of our `ZonedDateTime` object.
    DateTimeFormatter.ISO_LOCAL_DATE_TIME    // This standard ISO 8601 format is close to your desired output.
)                                            // Returns a `String`.
.replace( "T" , " " )                        // Replace `T` in middle with a SPACE.

java.time

Современный подход использует java.time классы, которые годы назад вытеснили ужасные старые классы даты и времени, такие как Calendar & SimpleDateFormat.

хотят текущие дату и время

Записать текущий момент в UTC, используя Instant.

Instant instant = Instant.now() ;

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

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

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

Или, как ярлык, передать ZoneId методу ZonedDateTime.now.

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Pacific/Auckland" ) ) ;

Классы java.time используют разрешение наносекунд .Это означает до девяти цифр десятичной доли секунды.Если вы хотите только три, миллисекунды, усечь .Передайте желаемый предел в виде объекта перечисления ChronoUnit.

ZonedDateTime
.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)
.truncatedTo(
    ChronoUnit.MILLIS
)

в формате «дд / мм / гггг ЧЧ: мм: сс.СС»

Я рекомендую всегда включать смещение от UTC или часовой пояс при генерации строки, чтобы избежать двусмысленности и недопонимания.

Но если вы настаиваете, вы можете указать конкретный формат при генерации строки для представления значения даты и времени.Встроенный предопределенный форматер почти соответствует желаемому формату, но для T, где вы хотите пробел.

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

sdf1.applyPattern ("дд / мм / гггг ЧЧ:mm: ss.SS ");

Date date = sdf1.parse (strDate);

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

Вместо этого используйте стандартные форматы, определенные для этой цели, которые можно найти в ISO 8601 .

java.time по умолчанию используют эти форматы ISO 8601, когдапарсинг / генерация строк.

Всегда включайте индикатор смещения от UTC или часового пояса при обмене конкретным моментом.Таким образом, желаемый формат, обсуждаемый выше, следует избегать для обмена данными.Кроме того, как правило, лучше всего обменять момент как UTC.Это означает Instant в java.time .Вы можете обменять Instant с ZonedDateTime, эффективно настраивая часовой пояс на UTC для того же момента, той же точки на временной шкале, но другого настенного времени.

Instant instant = zdt.toInstant() ;
String exchangeThisString = instant.toString() ;

2018-01-23T01: 23: 45.123456789Z

В этом формате ISO 8601 используется символ Z в конце для обозначения UTC, произносится «Zulu».


О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Вы можете обмениваться java.time объектами непосредственно с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.* классах.

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

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

1 голос
/ 05 января 2012

Вывод вашей первой строки печати использует ваш форматтер.Выходные данные вашего второго (дата, созданная из вашей проанализированной строки) выводятся с использованием Date # toString, который форматирует в соответствии со своими собственными правилами.То есть вы не используете форматер.

Правила соответствуют тому, что вы видите и описали здесь: http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#toString()

0 голосов
/ 24 сентября 2018

Отказ от ответственности: этот ответ не подтверждает использование класса Date (на самом деле он давно устарел и плохо спроектирован, поэтому я бы предпочел полностью его не одобрить).Я пытаюсь ответить на регулярно повторяющийся вопрос об объектах даты и времени в формате.Для этого я использую класс Date в качестве примера.Другие классы обрабатываются в конце.

Вы не хотите

Вы не хотите Date с определенным форматом.Хорошей практикой во всех, кроме самых простых одноразовых программах, является отделение вашего пользовательского интерфейса от вашей модели и бизнес-логики.Значение объекта Date принадлежит вашей модели, поэтому держите свой Date там и никогда не позволяйте пользователю видеть его напрямую.Когда вы придерживаетесь этого, никогда не будет иметь значения, какой формат имеет Date.Всякий раз, когда пользователь должен увидеть дату, отформатируйте ее в String и покажите строку пользователю.Точно так же, если вам нужен определенный формат для сохранения или обмена с другой системой, отформатируйте Date в строку для этой цели.Если пользователю необходимо ввести дату и / или время, либо примите строку, либо используйте средство выбора даты или время.

Особый случай: сохранение в базе данных SQL.Может показаться, что ваша база данных требует определенного формата.Не так.Используйте yourPreparedStatement.setObject(yourParamIndex, yourDateOrTimeObject), где yourDateOrTimeObject - это LocalDate, Instant, LocalDateTime или экземпляр соответствующего класса даты и времени из java.time.И снова не беспокойтесь о формате этого объекта.Поиск более подробной информации.

Вы не можете

A Date не получил, так как в не может иметь формат.Это момент времени, ни больше, ни меньше.Контейнер значения.В вашем коде sdf1.parse преобразует вашу строку в Date объект, то есть в момент времени.Он не сохраняет ни строку, ни формат, который был в строке.

Чтобы закончить рассказ, давайте посмотрим и на следующую строку из вашего кода:

    System.out.println("Current date in Date Format: "+date);

Чтобывыполнить конкатенацию строк, требуемую знаком +, который необходим Java для преобразования вашего Date в String.Это делается путем вызова метода toString вашего объекта Date.Date.toString всегда создает строку типа Thu Jan 05 21:10:17 IST 2012.Вы не можете изменить это (кроме подкласса Date, но вы этого не хотите).Затем сгенерированная строка объединяется со строковым литералом, чтобы получить строку, напечатанную System.out.println.

Короче говоря, «формат» применяется только к строковым представлениям дат, а не к самим датам.

Разве не странно, что у Даты нет формата?

Я думаю, то, что я написал, вполне соответствует нашим ожиданиям.Это похоже на другие типы.Подумайте о int.Один и тот же int может быть отформатирован в строки типа 53,551, 53.551 (с точкой в ​​качестве разделителя тысяч), 00053551, +53 551 или даже 0x0000_D12F.Все это форматирование создает строки, в то время как int остается неизменным и не меняет свой формат.С объектом Date он точно такой же: вы можете отформатировать его во множество различных строк, но сам Date всегда остается неизменным.

Могу ли я тогда иметь LocalDate, ZonedDateTime, Calendar,GregorianCalendar, XMLGregorianCalendar, java.sql.Date, Time или Timestamp в формате по моему выбору?

Нет, вы не можете, и по тем же причинам, что и выше.Ни один из упомянутых классов, фактически ни один класс даты или времени, который я когда-либо встречал, не может иметь формат.Вы можете иметь желаемый формат только в String вне вашего объекта даты и времени.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...