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

  • 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 и другие.

Ответ 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();