Как преобразовать 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;
}
}
Это моя база данных:
![enter image description here]()
Здесь вывод, который я получил, был 2012-08-07 0, но эквивалентный запрос возвращает 3. Почему я получаю 0?
Ответы
Ответ 1
Просто создайте новый объект Date
со значением штампа getTime()
в качестве параметра.
Вот пример (я использую пример временной метки текущего времени):
Timestamp stamp = new Timestamp(System.currentTimeMillis());
Date date = new Date(stamp.getTime());
System.out.println(date);
Ответ 2
// 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();
Ответ 3
Просто:
Timestamp timestamp = new Timestamp(long);
Date date = new Date(timestamp.getTime());
Ответ 4
Я давно искал это, оказалось, что конвертер 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));
Ответ 5
ТЛ; др
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 JVMs 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
аргумент 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
. Эта команда полностью закрыта ([]
) (начало и конец включительно), где мы хотим Half-Open ([)
). Мы используем пару критериев >=
и <
.
Ваша колонка плохо названа. Избегайте любого из тысячи слов, зарезервированных различными базами данных. Давайте использовать placed
в этом примере.
Ваш код должен был использовать ?
заполнители, в которых можно указать наши моменты.
String sql = "SELECT * FROM orders WHERE placed >= ? AND placed < ? ; " ;
Но у нас ZonedDateTime
объекты ZonedDateTime
в то время как ваша база данных хранит целые числа, как обсуждалось выше. Если вы правильно определили свой столбец, мы могли бы просто передать объекты ZonedDateTime
с любым драйвером JDBC, поддерживающим JDBC 4.2 или более поздней ZonedDateTime
.
Но вместо этого нам нужно получить отсчет от эпохи за целые секунды. Я предполагаю, что вашей датой отсчета эпохи является первый момент 1970 года в UTC. Остерегайтесь возможной потери данных, поскольку класс 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. И поиск для многих примеров и объяснений. Спецификация JSR 310.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 6
Прежде всего, вы не используете преимущество использования PreparedStatement
. Сначала я предлагаю вам изменить ваш PreparedStatement
следующим образом:
PreparedStatement statement = con.prepareStatement("select * from orders where status=? AND date=?")
Затем вы можете использовать statement.setXX(param_index, param_value)
для установки соответствующих значений. Для преобразования в timestamp
ознакомьтесь со следующими javadocs:
PreparedStatement.setTimeStamp()
Timestamp
Надеюсь, это поможет!
Ответ 7
Не уверен, что вы пытаетесь выбрать в запросе, но имейте в виду, что UNIX_TIMESTAMP()
без аргументов возвращает время. Вероятно, вы должны указать действительное время в качестве аргумента или изменить условие.
EDIT:
Ниже приведен пример запроса по времени, основанного на вопросе:
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);
Ответ 8
В 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(), чтобы получить текущую временную метку
Ответ 9
new Date(timestamp.getTime())
должен работать, но новый причудливый способ Java 8 (который может быть более элегантным и более безопасным по типу, а также поможет вам использовать новые классы времени) заключается в вызове Date.from(timestamp.toInstant())
.
(Не полагайтесь на то, что Timestamp
сам является экземпляром Date
, см. объяснение в комментариях другого ответа.)
Ответ 10
Timestamp tsp = new Timestamp(System.currentTimeMillis());
java.util.Date dateformat = new java.util.Date(tsp.getTime());
Ответ 11
Я чувствую себя обязанным ответить, потому что другие ответы кажутся агностиками часовых поясов, которые реальное приложение не может себе позволить. Чтобы сделать правильную временную конверсию, когда временная метка и JVM используют разные часовые пояса, вы можете использовать Joda Time LocalDateTime (или LocalDateTime в Java8), например:
Timestamp timestamp = resultSet.getTimestamp("time_column");
LocalDateTime localDateTime = new LocalDateTime(timestamp);
Date trueDate = localDateTime.toDate(DateTimeZone.UTC.toTimeZone());
В приведенном ниже примере предполагается, что отметка времени - это UTC (как это обычно бывает в случае с базами данных). Если ваши временные метки находятся в другом часовом поясе, измените параметр временной зоны оператора toDate
.
Ответ 12
попробуйте использовать этот 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);
Ответ 13
Предполагая, что у вас есть уже существующий java.util.Date date
:
Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
Ответ 14
Вы можете использовать этот метод, чтобы получить Date from Timestamp и Time-zone определенной области.
public String getDayOfTimestamp(long yourLinuxTimestamp, String timeZone) {
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(yourLinuxTimestamp * 1000);
cal.setTimeZone(TimeZone.getTimeZone(timeZone));
Date date = cal.getTime();
}
Ответ 15
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;
Ответ 16
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date fecha = getDateInTimestamp();