Хотите иметь текущую дату и время в формате "dd/MM/yyyy HH: mm: ss.SS"

Я использую следующий код для получения даты в формате "dd/MM/yyyy HH: mm: ss.SS".

    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

Просьба указать, что я должен сделать, чтобы отобразить дату в том же строчном формате (dd/MM/yyyy HH: mm: ss.SS) i.e Мне нужен следующий вывод:

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

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

Ответы

Ответ 2

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

Ответ 3

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

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

    }
}

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

ТЛ; др

  • Используйте современные классы 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 чтобы получить 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 перечисления 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("дд/мм/гггг ЧЧ: мм: сс.СС");

Дата дата = 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 и другие.

Ответ 7

Вот простой фрагмент, работающий в Java 8 и использующий "новый" API даты и времени LocalDateTime:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss.SS");
LocalDateTime now = LocalDateTime.now();
System.out.println(dtf.format(now)); 

Ответ 8

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

Вы не хотите

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

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

Ты не можешь

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 вне вашего объекта даты и времени.

связи