如何创建具有 java 值的日期对象

我需要一个日期对象的日期2014-02-11。 我不能像这样直接创造它,

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

所以我就这么做了,

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

有什么简单的方法可以在 Java 中创建日期对象吗?

378718 次浏览

我认为最好的方法是使用 SimpleDateFormat对象。

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

试试这个

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

明白了: 按月传递2可能会给你意想不到的结果: 在日历 API 中,月是从零开始的。实际上是三月。

我不知道什么是一个“简单”的方式,你正在寻找,因为我觉得使用日历已经很容易。

请记住使用正确的月份常数:

 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 日期/日历。切换到 JODA Time 或 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);

博士

LocalDate.of( 2014 , 2 , 11 )

如果你坚持使用可怕的老 java.util.Date类,转换从现代的 爪哇时间类。

java.util.Date                        // Terrible old legacy class, avoid using. Represents a moment in UTC.
.from(                                // New conversion method added to old classes for converting between legacy classes and modern classes.
LocalDate                         // Represents a date-only value, without time-of-day and without time zone.
.of( 2014 , 2 , 11 )              // Specify year-month-day. Notice sane counting, unlike legacy classes: 2014 means year 2014, 1-12 for Jan-Dec.
.atStartOfDay(                    // Let java.time determine first moment of the day. May *not* start at 00:00:00 because of anomalies such as Daylight Saving Time (DST).
ZoneId.of( "Africa/Tunis" )   // Specify time zone as `Continent/Region`, never the 3-4 letter pseudo-zones like `PST`, `EST`, or `IST`.
)                                 // Returns a `ZonedDateTime`.
.toInstant()                      // Adjust from zone to UTC. Returns a `Instant` object, always in UTC by definition.
)                                     // Returns a legacy `java.util.Date` object. Beware of possible data-loss as any microseconds or nanoseconds in the `Instant` are truncated to milliseconds in this `Date` object.

细节

如果您想要“简单”,那么应该在 Java8中使用新的 Java.time 软件包,而不是众所周知的麻烦的 Java.util。日期 & 。与 Java 绑定的日历类。

爪哇时间

内置于 Java8及其后的 爪哇时间框架取代了麻烦的旧 Java.util.Date/. Calendar 类。

只限约会

enter image description here

Time 提供了一个 LocalDate类来表示一个只有日期的值,没有任何时间或时区。你确实需要一个时区来确定一个日期,例如,巴黎新的一天比蒙雷阿勒更早到来。ZoneId类是用于时区的。

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

转储到控制台:

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

今天: 2015-11-26区域: 亚洲/新加坡

或者使用工厂方法指定年、月、日。

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

LocalDate: 2014-02-11本地日期: 2014-02-11

或者传递一个月号1-12,而不是一个 DayOfWeek枚举对象。

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

时区

enter image description here

LocalDate没有真正的意义,除非你把它调整到一个时区。在 java.time 中,我们应用一个时区来生成一个 ZonedDateTime对象。这也意味着一天中的某个时间,但是什么时间呢?一天中的第一时刻通常是有意义的。你可能认为这意味着时间 00:00:00.000,但并不总是正确的,因为夏时制(dST) ,也许其他异常。我们不假设这个时间,而是通过调用 atStartOfDay让 java.time 确定一天中的第一个时刻。

指定 continent/region格式的 正确的时区名称,例如 America/MontrealAfrica/CasablancaPacific/Auckland。永远不要使用3-4个字母的缩写,如 ESTIST,因为它们是 没有真正的时区,不标准化,甚至不唯一(!).

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

Zdt: 2014-02-11 T00:00 + 08:00[亚洲/新加坡]

协调世界时

enter image description here

对于后端工作(业务逻辑、数据库、数据存储和交换) ,我们通常使用 协调世界时时区。在 java.time 中,Instant类以 UTC 表示时间线上的某个时刻。可以通过调用 toInstant从 ZonedDateTime 中提取 Instant 对象。

Instant instant = zdt.toInstant();

即时通讯: 2014-02-10T16:00:00Z

改变信仰

您应该完全避免使用 java.util.Date类。但是,如果必须与尚未为 爪哇时间更新的旧代码进行互操作,则可以来回转换。查看添加到旧类中的新转换方法。

java.util.Date d = java.util.from( instant ) ;

还有..。

Instant instant = d.toInstant() ;

Table of all date-time types in Java, both modern and legacy


关于 爪哇时间

< em > java.time 框架内置于 Java8及更高版本中。这些类取代了令人讨厌的旧的 遗产日期时间类,如 java.util.DateCalendarSimpleDateFormat

要了解更多,请参阅 < em > Oracle 教程 。并搜索堆栈溢出许多例子和解释。规范是 JSR 310

现在在 维修模式中的 尤达时间项目建议迁移到 爪哇时间类。

您可以直接与数据库交换 爪哇时间对象。使用与 JDBC 4.2或更高版本兼容的 JDBC 驱动程序。不需要字符串,不需要 java.sql.*类。Hibernate 5 & JPA 2.2支持 爪哇时间

从哪里获得 java.time 类?


更新: Joda 时间库现在处于维护模式,建议迁移到 爪哇时间类。我将把这一部分留给历史。

Joda 时间

一方面,Joda-Time 使用合理的编号,所以二月份是 2而不是 1。另外,与 java.util 不同,Joda-TimeDateTime 确实知道它所分配的时区。似乎有时区但没有的日期。

不要忘记时区,否则您将得到 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();

我认为你的日期来自 php 和写到 html (多姆)或? 我有一个 php 函数来准备所有的日期和时间戳。

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

这种格式可以在 js 上用来创建新的 Date..。

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

我要说的是,让你自己的功能包装,使你的生活更容易。 你可以我们的函数作为样品,但是包括在我的厘米你不能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();
}
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));
}
}

来自 Java8:

import java.time.Instant;
import java.util.Date;


Date date = Date.from(Instant.parse("2000-01-01T00:00:00.000Z"))
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.ENGLISH);
//format as u want


try {
String dateStart = "June 14 2018 16:02:37";
cal.setTime(sdf.parse(dateStart));
//all done
} catch (ParseException e) {
e.printStackTrace();
}

最简单的方法:

Date date = Date.valueOf("2000-1-1");
LocalDate localdate = LocalDate.of(2000,1,1);
LocalDateTime localDateTime = LocalDateTime.of(2000,1,1,0,0);