Как преобразовать TimeStamp в дату в Java?

106

Как мне преобразовать timeStamp в dateпосле того, как я получу счет в java?

Мой текущий код выглядит следующим образом:

public class GetCurrentDateTime {

    public int data() {
        int count = 0;
        java.sql.Timestamp timeStamp = new Timestamp(System.currentTimeMillis());
        java.sql.Date date = new java.sql.Date(timeStamp.getTime()); 
        System.out.println(date);
        //count++;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/pro", "root", "");

            PreparedStatement statement = con.prepareStatement("select * from orders where status='Q' AND date=CURDATE()");
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                // Do something with the row returned.
                count++; //if the first col is a count.
            }
        } catch (Exception exc) {
            System.out.println(exc.getMessage());
        }

        return count;
    }
}

Это моя база данных: введите описание изображения здесь

Здесь я получил результат 2012-08-07 0, но эквивалентный запрос возвращает 3. Почему я получаю 0?

Кришна Вени
источник
Дубликат stackoverflow.com/questions/2318719/…
Росди Касим
Вы можете показать нам примеры того, как выглядят данные таблицы?
oldrinb
дата (1344255451,1344255537,1344312502) и статус (Q, Q, Q)
Кришна Вени,
Дубликат этого вопроса, как преобразовать из java.sql.Timestamp в java.util.Date? .
Basil Bourque
Название этого вопроса - отвлекающий маневр . Настоящая проблема - это неправильное использование PreparedStatementс неправильным синтаксисом. Вы не можете вставлять переменные Java в текст вашей строки SQL. Вместо этого вставьте ?строку SQL, а затем вызовите setметоды для передачи значений в PreparedStatement. См. Правильный ответ Суджая и ответ tenorsax .
Basil Bourque

Ответы:

189

Просто создайте новый Dateобъект со значением штампа getTime()в качестве параметра.

Вот пример (я использую временную метку текущего времени):

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
Алекс Коулман
источник
@ vs06 Почему вы думаете, что он устарел? В последних документах java 7 и 8 указано иное ( docs.oracle.com/javase/7/docs/api/java/util/Date.html#getTime () и docs.oracle.com/javase/8/docs/api /java/util/Date.html#getTime-- )
Alex Coleman,
4
Это приведет к неверному результату, если часовой пояс Timestamp и часовой пояс JVM отличаются.
Роберт Мугаттаров
Как это отформатировать, например, до 14.03.2014?
shurrok
6
Я ненавижу, когда люди используют библиотеки в своих ответах, и ожидаю, что все знают, как их импортировать: /
Sodj
38
// timestamp to Date
long timestamp = 5607059900000; //Example -> in ms
Date d = new Date(timestamp );

// Date to timestamp
long timestamp = d.getTime();

//If you want the current timestamp :
Calendar c = Calendar.getInstance();
long timestamp = c.getTimeInMillis();
Винсент Ламут
источник
Зачем вы умножили на 1000?
Sharpless512
3
Потому что инициализация даты выполняется в миллисекундах, а метка времени - в секундах! То же самое и со всеми остальными преобразованиями! Это хорошо ?
VincentLamoute
10

Просто:

Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
Альберто Черкейра
источник
7

Давно искал это, оказывается, конвертер Eposh делает это легко:

long epoch = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;

Или наоборот:

String date = new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(new java.util.Date (epoch*1000));
Джокер 00
источник
6

tl; dr

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

LocalDate.now( ZoneId.of( "Africa/Tunis" ) )
    .plusDays( 1 )
    .atStartOfDay( ZoneId.of( "Africa/Tunis" ) )
    .toEpochSecond()

"SELECT * FROM orders WHERE placed >= ? AND placed < ? ; "

myPreparedStatement.setObject( 1 , start )
myPreparedStatement.setObject( 2 , stop )

java.time

Вы используете проблемные старые классы даты и времени, которые теперь являются устаревшими, вытесненными современными классами java.time .

По-видимому, вы сохраняете момент в своей базе данных в столбце какого-то целочисленного типа. Это прискорбно. Вместо этого вы должны использовать столбец такого типа, как стандарт SQL TIMESTAMP WITH TIME ZONE. Но для этого ответа мы будем работать с тем, что у нас есть.

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

LocalDateКласс представляет собой дату только значение без времени суток и без временной зоны.

Часовой пояс имеет решающее значение при определении даты. В любой момент дата меняется в зависимости от зоны земного шара. Например, несколько минут после полуночи в Париже, Франция - это новый день, в то время как в Монреаль-Квебеке все еще «вчера» .

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

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

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

Или укажите дату. Вы можете установить месяц числом, с разумной нумерацией 1-12 для января-декабря.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

Или, лучше, используйте Monthпредопределенные объекты перечисления, по одному на каждый месяц года. Совет: используйте эти Monthобъекты во всей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументированным, гарантировать допустимые значения и обеспечить безопасность типов .

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

Теперь LocalDateнам нужно преобразовать его в пару моментов: начало и конец дня. Не предполагайте, что день начинается в 00:00:00 по времени суток. Из-за аномалий, таких как переход на летнее время (DST), день может начинаться в другое время, например 01:00:00. Так что пусть java.time определяет первый момент дня. Мы передаем ZoneIdаргумент, чтобы LocalDate::atStartOfDayнайти любые такие аномалии. В результате получился файл ZonedDateTime.

ZonedDateTime zdtStart = ld.atStartOfDay( z ) ;

Как правило, лучший подход к определению промежутка времени - это полуоткрытый подход, когда начало включено, а окончание - исключено . Итак, день начинается с его первого момента и продолжается до первого момента следующего дня, но не включая его.

ZonedDateTime zdtStop = ld.plusDays( 1 ).atStartOfDay( z ) ;  // Determine the following date, and ask for the first moment of that day.

Наш запрос на целый день не может использовать команду SQL BETWEEN. Эта команда - Fully-Closed ( []) (включая начало и конец), где, как мы хотим, Half-Open ( [)). Мы используем пару критериев >=и <.

Ваша колонка плохо названа. Избегайте любого из тысячи слов, зарезервированных в различных базах данных. Давайте использовать placedв этом примере.

В вашем коде должны быть ?заполнители для указания наших моментов.

String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;

Но у нас есть ZonedDateTimeобъекты, а ваша база данных, по-видимому, хранит целые числа, как обсуждалось выше. Если вы уже определили свой столбец правильно , мы могли бы просто передать ZonedDateTimeобъекты с любым драйвером JDBC с поддержкой JDBC 4.2 или более поздней версией.

Но вместо этого нам нужно получить отсчет от эпохи в целых секундах. Я предполагаю, что ваша контрольная дата эпохи - это первый момент 1970 года по всемирному координированному времени. Остерегайтесь возможной потери данных, так как этот ZonedDateTimeкласс имеет наносекундное разрешение. Любая дробная секунда будет усечена в следующих строках.

long start = zdtStart().toEpochSecond() ;  // Transform to a count of whole seconds since 1970-01-01T00:00:00Z.
long stop = zdtStop().toEpochSecond() ; 

Теперь мы готовы передать эти целые числа в наш код SQL, определенный выше.

PreparedStatement ps = con.prepareStatement( sql );
ps.setObject( 1 , start ) ;
ps.setObject( 2 , stop ) ;
ResultSet rs = ps.executeQuery();

Когда вы извлекаете свои целочисленные значения из ResultSet, вы можете преобразовывать их в Instantобъекты (всегда в формате UTC) или в ZonedDateTimeобъекты (с назначенным часовым поясом).

Instant instant = rs.getObject(  , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .

Где взять классы java.time?

  • Java SE 8 , Java SE 9 и более поздние версии
    • Встроенный.
    • Часть стандартного Java API со встроенной реализацией.
    • В Java 9 добавлены некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android

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

Василий Бурк
источник
4

Прежде всего, вы не пользуетесь преимуществом использования PreparedStatement. Сначала я предлагаю вам изменить свой PreparedStatementследующим образом:

PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")

Затем вы можете использовать statement.setXX(param_index, param_value)для установки соответствующих значений. Для преобразования timestampв следующие javadocs:

PreparedStatement.setTimeStamp ()
Отметка времени

Надеюсь это поможет!

Суджай
источник
4

В Android это очень просто. Просто используйте класс Calender, чтобы получить currentTimeMillis.

Timestamp stamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
Date date = new Date(stamp.getTime());
Log.d("Current date Time is   "  +date.toString());

В Java просто используйте System.currentTimeMillis (), чтобы получить текущую метку времени

Ашиш Сайни
источник
3

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

РЕДАКТИРОВАТЬ:

Вот пример запроса с ограничением по времени, основанного на вопросе:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
statement.setDate(1, new java.sql.Date(date.getTime()));

РЕДАКТИРОВАТЬ: столбец отметки времени

В случае использования метки времени java.sql.Timestampи PreparedStatement.setTimestamp () , то есть:

PreparedStatement statement = con
        .prepareStatement("select * from orders where status='Q' AND date > ?");
Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2000");
Timestamp timestamp = new Timestamp(date.getTime());
statement.setTimestamp(1, timestamp);
тенорсакс
источник
теперь мое условие - select * from xcart_orders, где status = 'Q' AND date = CURDATE (). теперь также отображается только ноль
Кришна Вени,
@krishnaveni какие записи вы пытаетесь выбрать?
tenorsax 07
date (11111111,123456767,122333344) и status = (Q, Q, Q) .. все сохранены в моей базе данных. теперь я хочу проверить запрос и получить значение счетчика и отобразить на моей консоли (т.е.) сколько данные совпадают после возврата значения счетчика
Кришна Вени,
@krishnaveni Если вы хотите, чтобы набор результатов был привязан к определенной дате, используйте эту дату в запросе, в противном случае удалите условие даты.
tenorsax
в моем коде он работает успешно, когда дата находится в формате гггг-мм-дд, сохраненном в моей базе данных. Но теперь моя дата сохраняется в метке времени в этом формате 1343469690. Как получить значение счетчика? Как я написал здесь код
Кришна Вени
3

new Date(timestamp.getTime())должен работать, но новый причудливый способ Java 8 (который может быть более элегантным и более безопасным по типу, а также поможет вам использовать новые классы времени) - это вызвать Date.from(timestamp.toInstant()).

(Не полагайтесь на тот факт, что он Timestampсам является экземпляром Date; см. Объяснение в комментариях к другому ответу .)

Гаррет Уилсон
источник
3
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   java.util.Date dateformat = new java.util.Date(tsp.getTime());
Г-Н И
источник
3

Я чувствую себя обязанным ответить, поскольку другие ответы, похоже, не зависят от часовых поясов, что не может позволить себе приложение реального мира. Чтобы преобразовать метку времени в дату правильно, когда метка времени и JVM используют разные часовые пояса, вы можете использовать LocalDateTime Joda Time (или LocalDateTime в Java8) следующим образом:

Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());

В приведенном ниже примере предполагается, что метка времени - UTC (как это обычно бывает с базами данных). Если ваши временные метки находятся в другом часовом поясе, измените параметр часового пояса в toDateинструкции.

Роберт Мугаттаров
источник
3

попробуйте использовать этот java-код:

Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
DateFormat f1 = new SimpleDateFormat("yyyy/MM/dd");
String d = f.format(date);
String d1 = f1.format(date);
System.out.println(d);
System.out.println(d1);
Помощь разработчику
источник
0

Предполагая, что у вас уже есть java.util.Date date:

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
Альбиция
источник
0

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

public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(yourLinuxTimestamp * 1000);
    cal.setTimeZone(TimeZone.getTimeZone(timeZone));
    Date date = cal.getTime();
}
Манодж Патидар
источник
-1
String timestamp="";
Date temp=null;
try {
    temp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(getDateCurrentTimeZone(Long.parseLong(timestamp)));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
int dayMonth=temp.getDate();
int dayWeek=temp.getDay();
int hour=temp.getHours();
int minute=temp.getMinutes();
int month=temp.getMonth()+1;
int year=temp.getYear()+1900;
user1485365
источник
-3
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp(); 
Хосе Анхель Бесерра Бернальдес
источник