it-roy-ru.com

Как конвертировать TimeStamp в дату в 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?

91
Krishna Veni

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

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

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

Просто:

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

тЛ; др

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 по всей вашей кодовой базе, а не просто целое число, чтобы сделать ваш код более самодокументируемым, обеспечить допустимые значения и обеспечить type-safety .

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

Как правило, лучшим подходом к определению промежутка времени является подход 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 с любым драйвером JDBC, поддерживающим JDBC 4.2 или более позднюю версию.

Но вместо этого нам нужно получить отсчет от эпохи за целые секунды. Я предполагаю, что ваша справочная дата эпохи - это первый момент 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 Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 31 .

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

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

5
Basil Bourque

Я давно искал это, оказалось, что Eposh converter делает это легко:

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
Joker 00

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

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

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

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

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

4
Sujay
    Timestamp tsp = new Timestamp(System.currentTimeMillis());
   Java.util.Date dateformat = new Java.util.Date(tsp.getTime());
3
MR AND

Я чувствую себя обязанным ответить, так как другие ответы кажутся независимыми от часовых поясов, что приложение реального мира не может себе позволить. Чтобы сделать преобразование метки времени в дату правильным, когда метка времени и 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 (как это обычно происходит с базами данных). Если ваши временные метки находятся в другом часовом поясе, измените параметр часового пояса в toDatestatement.

3
Robert Mugattarov

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

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

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

В Android это очень просто. Просто используйте класс Calendar, чтобы получить 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
Ashish Saini

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

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

3
Garret Wilson

попробуйте использовать этот код 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);
0
Help developer

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

Timestamp timestamp = new Timestamp(long);
date.setTime( l_timestamp.getTime() );
0
Albizia

Вы можете использовать этот метод, чтобы получить 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();
}
0
Manoj Patidar