Подтвердить что ты не робот

Как создать объект Date со значениями в java

Мне нужен объект даты на дату 2014-02-11. Я не могу напрямую создать его так,

Date myDate = new Date(2014, 02, 11);

Итак, я делаю, как следует,

Calendar myCalendar = new GregorianCalendar(2014, 2, 11);
Date myDate = myCalendar.getTime();

Есть ли простой способ создания объекта даты в java?

4b9b3361

Ответ 1

First Gotcha: переход на второй месяц может дать вам что-то неожиданное: месяц основан на нулевом значении, что означает, что 2 фактически является мартом.

Я не знаю, что такое "легкий" способ, который вы ищете, поскольку я чувствую, что использование Календаря уже достаточно легко.

Не забудьте использовать правильные константы для месяца:

 Date date = new GregorianCalendar(2014, Calendar.FEBRUARY, 11).getTime();

Другой способ - использовать DateFormat, который я обычно использую следующим образом:

 public static Date parseDate(String date) {
     try {
         return new SimpleDateFormat("yyyy-MM-dd").parse(date);
     } catch (ParseException e) {
         return null;
     }
  }

чтобы я мог просто написать

Date myDate = parseDate("2014-02-14");

Еще одна альтернатива, которую я предпочитаю: больше не используйте Java Date/Calendar. Переключитесь на время JODA или Java Time (ака JSR310, доступное в JDK 8+). Вы можете использовать LocalDate для представления даты, которую можно легко создать с помощью

LocalDate myDate =LocalDate.parse("2014-02-14");
// or
LocalDate myDate2 = new LocalDate(2014, 2, 14);
// or, in JDK 8+ Time
LocalDate myDate3 = LocalDate.of(2014, 2, 14);

Ответ 2

Если вы хотите "легко", вы должны использовать Joda-Time или новый java.time package в Java 8, а не печально известные классы java.util.Date и .Calendar в комплекте с Java.

Joda времени

Во-первых, Joda-Time использует разумную нумерацию, поэтому в феврале 2 not 1. Другое дело, Joda-Time DateTime действительно знает свой назначенный часовой пояс в отличие от java.util.Date, который, кажется, имеет часовой пояс, но не делает.

И не забудьте часовой пояс. В противном случае вы будете получать JVM по умолчанию.

DateTimeZone timeZone = DateTimeZone.forID( "Asia/Singapore" );
DateTime dateTimeSingapore = new DateTime( 2014, 2, 11, 0, 0, timeZone );
DateTime dateTimeUtc = dateTimeSingapore.withZone( DateTimeZone.UTC );

java.util.Locale locale = new java.util.Locale( "ms", "SG" ); // Language: Bahasa Melayu (?). Country: Singapore.
String output = DateTimeFormat.forStyle( "FF" ).withLocale( locale ).print( dateTimeSingapore );

Дамп для консоли...

System.out.println( "dateTimeSingapore: " + dateTimeSingapore );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "output: " + output );

При запуске...

dateTimeSingapore: 2014-02-11T00:00:00.000+08:00
dateTimeUtc: 2014-02-10T16:00:00.000Z
output: Selasa, 2014 Februari 11 00:00:00 SGT

Конверсия

Если вам нужно преобразовать в java.util.Date для использования с другими классами...

java.util.Date date = dateTimeSingapore.toDate();

java.time

Структура java.time, встроенная в Java 8, а затем вытесняет неприятные старые классы java.util.Date/.Calendar. Новые классы вдохновлены чрезвычайно успешной структурой Joda-Time, предназначенной в качестве ее преемника, схожей по концепции, но повторно созданной. Определено JSR 310. Расширено в проекте ThreeTen-Extra. См. Tutorial.

A LocalDate класс предлагается java.time для представления значения только для даты без какого-либо времени или часового пояса, Вам нужен часовой пояс, чтобы определить дату, поскольку новый день наступает раньше в Париже, чем, например, в Монреале. Класс ZoneId предназначен для часовых поясов.

ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
LocalDate today = LocalDate.now( zoneId );

Дамп для консоли:

System.out.println ( "today: " + today + " in zone: " + zoneId );

сегодня: 2015-11-26 в зоне: Азия/Сингапур

Или используйте метод factory, чтобы указать год, месяц, день.

LocalDate localDate = LocalDate.of( 2014 , Month.FEBRUARY , 11 );

localDate: 2014-02-11

Или передайте месяц номер 1-12, а не объект DayOfWeek enum.

LocalDate localDate = LocalDate.of( 2014 , 2 , 11 );

A LocalDate не имеет реального значения, пока вы не настроите его на часовой пояс. В java.time мы применяем часовой пояс для создания объекта ZonedDateTime. Это также означает время суток, но в какое время? Обычно имеет смысл идти с первого момента дня. Вы можете подумать, что это означает время 00:00:00.000, но не всегда истинное из-за летнего времени (DST) и, возможно, других аномалий. Вместо того, чтобы предполагать это время, мы запрашиваем java.time для определения первого момента дня, вызывая atStartOfDay.

ZoneId zoneId = ZoneId.of( "Asia/Singapore" );
ZonedDateTime zdt = localDate.atStartOfDay( zoneId );

zdt: 2014-02-11T00: 00 + 08: 00 [Азия/Сингапур]

Для фоновой работы (бизнес-логика, база данных, хранение и обмен данными) мы обычно используем часовой пояс UTC. В java.time класс Instant представляет момент на временной шкале в формате UTC. Мгновенный объект можно извлечь из ZonedDateTime, вызвав toInstant.

Instant instant = zdt.toInstant();

мгновение: 2014-02-10T16: 00: 00Z

Ответ 3

Я думаю, что лучший способ - использовать объект SimpleDateFormat.

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateString = "2014-02-11";
Date dateObject = sdf.parse(dateString); // Handle the ParseException here

Ответ 4

Попробуйте это

 Calendar cal = Calendar.getInstance();
    Date todayDate = new Date();
    cal.setTime(todayDate);

    // Set time fields to zero
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    todayDate = cal.getTime();

Ответ 5

import java.io.*;
import java.util.*;
import java.util.HashMap;

public class Solution 
{

    public static void main(String[] args)
    {
        HashMap<Integer,String> hm = new HashMap<Integer,String>();
        hm.put(1,"SUNDAY");
        hm.put(2,"MONDAY");
        hm.put(3,"TUESDAY");
        hm.put(4,"WEDNESDAY");
        hm.put(5,"THURSDAY");
        hm.put(6,"FRIDAY");
        hm.put(7,"SATURDAY");
        Scanner in = new Scanner(System.in);
        String month = in.next();
        String day = in.next();
        String year = in.next();

        String format = year + "/" + month + "/" + day;
        Date date = null;
        try
        {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
            date = formatter.parse(format);
        }
        catch(Exception e){
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(hm.get(dayOfWeek));
    }
}

Ответ 6

Я думаю, что ваша дата исходит от php и написана в html (dom) или? У меня есть php-функция для подготовки всех дат и временных меток. Это возвращает формулу, которая необходима.

$timeForJS = timeop($datetimeFromDatabase['payedon'], 'js', 'local'); // save 10/12/2016 09:20 on var

этот формат можно использовать в js для создания новой даты...

<html>
   <span id="test" data-date="<?php echo $timeForJS; ?>"></span>
   <script>var myDate = new Date( $('#test').attr('data-date') );</script>
</html>

Что я скажу, сделайте свою собственную функцию, чтобы сделать вашу жизнь проще. Вы можете использовать мой func как образец, но включен в мои cms, вы не можете копировать и вставлять 1 к 1:)

    function timeop($utcTime, $for, $tz_output = 'system')
{
    // echo "<br>Current time ( UTC ): ".$wwm->timeop('now', 'db', 'system');
    // echo "<br>Current time (USER): ".$wwm->timeop('now', 'db', 'local');
    // echo "<br>Current time (USER): ".$wwm->timeop('now', 'D d M Y H:i:s', 'local');
    // echo "<br>Current time with user lang (USER): ".$wwm->timeop('now', 'datetimes', 'local');

    // echo '<br><br>Calculator test is users timezone difference != 0! Tested with "2014-06-27 07:46:09"<br>';
    // echo "<br>Old time (USER -> UTC): ".$wwm->timeop('2014-06-27 07:46:09', 'db', 'system');
    // echo "<br>Old time (UTC -> USER): ".$wwm->timeop('2014-06-27 07:46:09', 'db', 'local');

    /** -- */
    // echo '<br><br>a Time from db if same with user time?<br>';
    // echo "<br>db-time (2019-06-27 07:46:09) time left = ".$wwm->timeleft('2019-06-27 07:46:09', 'max');
    // echo "<br>db-time (2014-06-27 07:46:09) time left = ".$wwm->timeleft('2014-06-27 07:46:09', 'max', 'txt');

    /** -- */
    // echo '<br><br>Calculator test with other formats<br>';
    // echo "<br>2014/06/27 07:46:09: ".$wwm->ntimeop('2014/06/27 07:46:09', 'db', 'system');

    switch($tz_output){
        case 'system':
            $tz = 'UTC';
            break;

        case 'local':
            $tz = $_SESSION['wwm']['sett']['tz'];
            break;

        default:
            $tz = $tz_output;
            break;
    }

    $date = new DateTime($utcTime,  new DateTimeZone($tz));

    if( $tz != 'UTC' ) // Only time converted into different time zone
    {
        // now check at first the difference in seconds
        $offset = $this->tz_offset($tz);
        if( $offset != 0 ){
            $calc = ( $offset >= 0  ) ? 'add' : 'sub';
            // $calc = ( ($_SESSION['wwm']['sett']['tzdiff'] >= 0 AND $tz_output == 'user') OR ($_SESSION['wwm']['sett']['tzdiff'] <= 0 AND $tz_output == 'local') ) ? 'sub' : 'add';
            $offset = ['math' => $calc, 'diff' => abs($offset)];
            $date->$offset['math']( new DateInterval('PT'.$offset['diff'].'S') ); // php >= 5.3 use add() or sub()
        }
    }

    // create a individual output
    switch( $for ){
        case 'js':
            $format = 'm/d/Y H:i'; // Timepicker use only this format m/d/Y H:i without seconds // Sett automatical seconds default to 00
            break;
        case 'js:s':
            $format = 'm/d/Y H:i:s'; // Timepicker use only this format m/d/Y H:i:s with Seconds
            break;
        case 'db':
            $format = 'Y-m-d H:i:s'; // Database use only this format Y-m-d H:i:s
            break;
        case 'date':
        case 'datetime':
        case 'datetimes':
            $format = wwmSystem::$languages[$_SESSION['wwm']['sett']['isolang']][$for.'_format']; // language spezific output
            break;
        default:
            $format = $for;
            break;
    }

    $output = $date->format( $format );

    /** Replacement
     * 
     * D = day short name
     * l = day long name
     * F = month long name
     * M = month short name
     */
    $output = str_replace([
        $date->format('D'),
        $date->format('l'),
        $date->format('F'),
        $date->format('M')
    ],[
        $this->trans('date', $date->format('D')),
        $this->trans('date', $date->format('l')),
        $this->trans('date', $date->format('F')),
        $this->trans('date', $date->format('M'))
    ], $output);

    return $output; // $output->getTimestamp();
}