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

Как преобразовать ‘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; } } 

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

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

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

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

 Timestamp stamp = new Timestamp(System.currentTimeMillis()); Date date = new Date(stamp.getTime()); System.out.println(date); 
 // 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(); 

Просто:

 Timestamp timestamp = new Timestamp(long); Date date = new Date(timestamp.getTime()); 

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

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

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

PreparedStatement.setTimeStamp ()
Отметка

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

Не уверен, что вы пытаетесь выбрать в запросе, но имейте в виду, что 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())); 

EDIT: временная колонка

В случае метки времени используйте 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); 

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

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

  Timestamp tsp = new Timestamp(System.currentTimeMillis()); java.util.Date dateformat = new java.util.Date(tsp.getTime()); 

В Android это очень просто. Просто используйте class 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 (), чтобы получить текущую временную метку

Я искал это с давних пор, получается, что конвертер 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)); 

ТЛ; др

 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

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

По-видимому, вы сохраняете момент в своей базе данных в столбце некоторого целочисленного типа. Это несчастливо. Вместо этого вы должны использовать столбец типа типа SQL-standard 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 применяется неявно. Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом streamе любого приложения в 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. 

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

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

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

 ZonedDateTime zdtStart = ld.atStartOfDay( z ) ; 

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

 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 ( [) ). Мы используем пару критериев >= и < .

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

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

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

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

Но вместо этого нам нужно получить отсчет от эпохи целыми секундами. Я предполагаю, что ваша контрольная дата эпохи - это первый момент 1970 года в UTC. Остерегайтесь возможной потери данных, так как class 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 и более поздние версии . Эти classы вытесняют неприятные старые устаревшие classы времени, такие как java.util.Date , Calendar и SimpleDateFormat .

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

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

Где можно получить classы 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
    • Более поздние версии реализаций пакетов Android classов java.time.
    • Для более ранних Android проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Раздел Как использовать ThreeTenABP ....

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

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

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

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

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

 enter code here 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); 

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

 Timestamp timestamp = new Timestamp(long); date.setTime( l_timestamp.getTime() ); 
 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; 
 DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); Date fecha = getDateInTimestamp(); 
  • Есть ли какие-либо негативные последствия отключения временной метки последнего доступа?
  • Как получить временную метку unix в C #
  • Как получить временную отметку точности тика в .NET / C #?
  • java.util.Date формат SSSSSS: если не микросекунды, то какие последние 3 цифры?
  • Должен ли я использовать тип данных datetime или timestamp в MySQL?
  • Функция, которая создает временную метку в c #
  • Как доказать, что файл не подделан?
  • Как ключевые слова IMMUTABLE, STABLE и VOLATILE влияют на поведение функции?
  • Как изменить временную метку файла?
  • Почему в предложении DEFAULT может быть только один столбец TIMESTAMP с CURRENT_TIMESTAMP?
  • Временная метка создания и timestamp последнего обновления с Hibernate и MySQL
  • Давайте будем гением компьютера.