Как мне преобразовать 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?
PreparedStatement
с неправильным синтаксисом. Вы не можете вставлять переменные Java в текст вашей строки SQL. Вместо этого вставьте?
строку SQL, а затем вызовитеset
методы для передачи значений в PreparedStatement. См. Правильный ответ Суджая и ответ tenorsax .Ответы:
Просто создайте новый
Date
объект со значением штампаgetTime()
в качестве параметра.Вот пример (я использую временную метку текущего времени):
источник
источник
Просто:
источник
Давно искал это, оказывается, конвертер Eposh делает это легко:
Или наоборот:
источник
tl; dr
…
…
…
java.time
Вы используете проблемные старые классы даты и времени, которые теперь являются устаревшими, вытесненными современными классами java.time .
По-видимому, вы сохраняете момент в своей базе данных в столбце какого-то целочисленного типа. Это прискорбно. Вместо этого вы должны использовать столбец такого типа, как стандарт SQL
TIMESTAMP WITH TIME ZONE
. Но для этого ответа мы будем работать с тем, что у нас есть.Если ваши записи представляют моменты с разрешением в миллисекунды, и вам нужны все записи за целый день, тогда нам нужен временной диапазон. У нас должен быть момент начала и момент остановки. В вашем запросе есть только один критерий даты и времени, а у него должна быть пара.
LocalDate
Класс представляет собой дату только значение без времени суток и без временной зоны.Часовой пояс имеет решающее значение при определении даты. В любой момент дата меняется в зависимости от зоны земного шара. Например, несколько минут после полуночи в Париже, Франция - это новый день, в то время как в Монреаль-Квебеке все еще «вчера» .
Если часовой пояс не указан, JVM неявно применяет текущий часовой пояс по умолчанию. Это значение по умолчанию может измениться в любой момент, поэтому ваши результаты могут отличаться. Лучше явно указать желаемый / ожидаемый часовой пояс в качестве аргумента.
Укажите правильное время имя зоны в формате
continent/region
, напримерAmerica/Montreal
,Africa/Casablanca
илиPacific/Auckland
. Никогда не используйте аббревиатуру из 3–4 букв, напримерEST
или,IST
поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).Если вы хотите использовать текущий часовой пояс JVM по умолчанию, запросите его и передайте в качестве аргумента. Если опущено, текущее значение по умолчанию JVM применяется неявно. Лучше быть явным, поскольку значение по умолчанию может быть изменено в любой момент во время выполнения любым кодом в любом потоке любого приложения в JVM.
Или укажите дату. Вы можете установить месяц числом, с разумной нумерацией 1-12 для января-декабря.
Или, лучше, используйте
Month
предопределенные объекты перечисления, по одному на каждый месяц года. Совет: используйте этиMonth
объекты во всей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументированным, гарантировать допустимые значения и обеспечить безопасность типов .Теперь
LocalDate
нам нужно преобразовать его в пару моментов: начало и конец дня. Не предполагайте, что день начинается в 00:00:00 по времени суток. Из-за аномалий, таких как переход на летнее время (DST), день может начинаться в другое время, например 01:00:00. Так что пусть java.time определяет первый момент дня. Мы передаемZoneId
аргумент, чтобыLocalDate::atStartOfDay
найти любые такие аномалии. В результате получился файлZonedDateTime
.Как правило, лучший подход к определению промежутка времени - это полуоткрытый подход, когда начало включено, а окончание - исключено . Итак, день начинается с его первого момента и продолжается до первого момента следующего дня, но не включая его.
Наш запрос на целый день не может использовать команду SQL
BETWEEN
. Эта команда - Fully-Closed ([]
) (включая начало и конец), где, как мы хотим, Half-Open ([)
). Мы используем пару критериев>=
и<
.Ваша колонка плохо названа. Избегайте любого из тысячи слов, зарезервированных в различных базах данных. Давайте использовать
placed
в этом примере.В вашем коде должны быть
?
заполнители для указания наших моментов.Но у нас есть
ZonedDateTime
объекты, а ваша база данных, по-видимому, хранит целые числа, как обсуждалось выше. Если вы уже определили свой столбец правильно , мы могли бы просто передатьZonedDateTime
объекты с любым драйвером JDBC с поддержкой JDBC 4.2 или более поздней версией.Но вместо этого нам нужно получить отсчет от эпохи в целых секундах. Я предполагаю, что ваша контрольная дата эпохи - это первый момент 1970 года по всемирному координированному времени. Остерегайтесь возможной потери данных, так как этот
ZonedDateTime
класс имеет наносекундное разрешение. Любая дробная секунда будет усечена в следующих строках.Теперь мы готовы передать эти целые числа в наш код SQL, определенный выше.
Когда вы извлекаете свои целочисленные значения из
ResultSet
, вы можете преобразовывать их вInstant
объекты (всегда в формате UTC) или вZonedDateTime
объекты (с назначенным часовым поясом).О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
Прежде всего, вы не пользуетесь преимуществом использования
PreparedStatement
. Сначала я предлагаю вам изменить свойPreparedStatement
следующим образом:Затем вы можете использовать
statement.setXX(param_index, param_value)
для установки соответствующих значений. Для преобразованияtimestamp
в следующие javadocs:PreparedStatement.setTimeStamp ()
Отметка времени
Надеюсь это поможет!
источник
В Android это очень просто. Просто используйте класс Calender, чтобы получить currentTimeMillis.
В Java просто используйте System.currentTimeMillis (), чтобы получить текущую метку времени
источник
Не уверен, что вы пытаетесь выбрать в запросе, но имейте в виду, что
UNIX_TIMESTAMP()
без аргументов возвращается время сейчас. Вероятно, вам следует указать допустимое время в качестве аргумента или изменить условие.РЕДАКТИРОВАТЬ:
Вот пример запроса с ограничением по времени, основанного на вопросе:
РЕДАКТИРОВАТЬ: столбец отметки времени
В случае использования метки времени
java.sql.Timestamp
и PreparedStatement.setTimestamp () , то есть:источник
new Date(timestamp.getTime())
должен работать, но новый причудливый способ Java 8 (который может быть более элегантным и более безопасным по типу, а также поможет вам использовать новые классы времени) - это вызватьDate.from(timestamp.toInstant())
.(Не полагайтесь на тот факт, что он
Timestamp
сам является экземпляромDate
; см. Объяснение в комментариях к другому ответу .)источник
источник
Я чувствую себя обязанным ответить, поскольку другие ответы, похоже, не зависят от часовых поясов, что не может позволить себе приложение реального мира. Чтобы преобразовать метку времени в дату правильно, когда метка времени и JVM используют разные часовые пояса, вы можете использовать LocalDateTime Joda Time (или LocalDateTime в Java8) следующим образом:
В приведенном ниже примере предполагается, что метка времени - UTC (как это обычно бывает с базами данных). Если ваши временные метки находятся в другом часовом поясе, измените параметр часового пояса в
toDate
инструкции.источник
попробуйте использовать этот java-код:
источник
Предполагая, что у вас уже есть
java.util.Date date
:источник
Вы можете использовать этот метод для получения даты из метки времени и часового пояса определенной области.
источник
источник
источник