日期格式转换为java中特定格式的Date对象

时间:2012-10-25 06:18:43

标签: java date

我使用Date date3 = Calendar.getInstance().getTime();查找当前时间 这给了我Thu Oct 25 11:42:22 IST 2012

现在我希望我的日期格式为2012.10.25,而且也是Date对象,而不是字符串。

我尝试使用以下代码

DateFormat df = new SimpleDateFormat("yyyy.MM.dd");
Date startDate = df.parse(c_date1);

但是当我最终使用System.out.println(startDate.toString());时,它再次给了我 Thu Oct 25 00:00:00 IST 2012.这实际上是因为toString()函数已经以显示此格式的方式实现。

有没有其他方法可以将日期作为2012.10.25,也可以作为日期格式。日期对象是必需的,因为它将作为日期字段保存在db中。

9 个答案:

答案 0 :(得分:9)

您需要使用df.format(Date)方法获取所需格式的日期

答案 1 :(得分:8)

Date类没有“内部”格式,它只表示日期元素。要使用特定格式输出它,您需要按照以下方式进行输出:String tDate = formatter1.format(date);

您认为它具有“错误格式”的原因可能是因为当您尝试输出它时,默认情况下会执行toString(),而不会按照您希望的方式对其进行格式化。

如果您向我们提供有关如何使用该日期的更多详细信息(包括您的代码),那么我们可能会提供有关如何将格式化程序注入其中的建议。

日期本身不存储任何格式信息。

答案 2 :(得分:3)

Date date3 = Calendar.getInstance().getTime();
SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");
System.out.println(df.format(date3));

答案 3 :(得分:2)

    Date date3 = Calendar.getInstance().getTime();
    SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");

    java.sql.Date date = null;

    try {
        date =new java.sql.Date(df.parse(df.format(date3)).getTime());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(date);

答案 4 :(得分:1)

日期对象没有任何格式。即你不能将任何Date对象转换为特定格式。因为它有自己的字符串格式,当你打印任何日期时它将返回。您只能转换任何字符串格式。

您可以从特定格式的日期字符串转换或构造任何日期对象。但该日期对象不会采用特定格式。

答案 5 :(得分:1)

你的问题就像问:

我有一个值为1234567的int变量,我希望它存储为" 1,234,567"在那个变量中。

这根本不合理。

如何存储值,与值的呈现方式无关。

答案 6 :(得分:1)

TL;博士

避免可怕的遗留日期时间类(DateSimpleDateFormat)。仅使用现代 java.time 类。

LocalDate.now(                                    // Instantiate a date-only object, without time-of-day and without time zone.
    ZoneId.of( "India/Kolkata" )                  // Capture the current date, “today”, as seen by the people in a certain region (a time zone). For any given moment, the date varies around the globe by zone.
)
.format(                                          // Generate a String whose text represents the date-time value of our `LocalDate` object.
    DateTimeFormatter.ofPattern( "uuuu.MM.dd" )   // Specify your desired formatting pattern.
)
  

2012年10月25日

将当前日期的仅日期值插入数据库:

myPreparedStatement.setObject( 
    … , 
    LocalDate.now( ZoneId.of( "India/Kolkata" ) ) 
) ;

将日期时间值与字符串

混淆

日期时间值没有“格式”。只有字符串才有格式。不要把两者混为一谈。可以通过解析String来实例化日期时间对象。并且日期时间对象可以生成String以文本方式表示其值。但是日期时间对象和这样的字符串保持独立和不同。

  

它再次给了我Thu Oct 25 00:00:00 IST 2012。这实际上是因为toString()函数已经以一种显示这种格式的方式实现。

不,toString方法不会“显示”此格式。该措辞暗示格式存在于Date对象中。但格式 not 生活在Date对象中 - Date根本没有“格式”。 toString方法生成一个字符串,其字符按此格式排列。

仅将日期与日期时间混淆

您似乎对仅限日期的值感兴趣,没有时间和没有时区。如果是,请使用LocalDate类。

通过解析字符串为您想要的值创建一个LocalDate对象。最容易使用 java.time 类中默认使用的标准ISO 8601格式:YYYY-MM-DD

String input = "2012-10-25" ;
LocalDate ld = LocalDate.parse( input ) ;  // No need to specify a formatting pattern, as ISO 8601 format used by default.

您的输入字符串采用非标准格式。发生在同一年 - 月 - 日订单中,所以我只想用连字符替换FULL STOP点。

String input = "2012.10.25".replace( "." , "-" ) ;  // Convert from custom format to standard ISO 8601 format.
LocalDate ld = LocalDate.parse( input ) ;  // No need to specify a formatting pattern, as ISO 8601 format used by default.

或指定格式化模式。

String input = "2012.10.25" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu.MM.dd" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

使用相同的格式化程序对象生成字符串。

String output = ld.format( f ) ;  // Generate a string in this custom format.

当前日期

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

如果未指定时区,则JVM会隐式应用其当前的默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好明确指定您期望/预期的时区作为参数。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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月的数字为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 ) ;

数据库

从JDBC 4.2及更高版本开始,我们可以直接与数据库交换 java.time 对象。

如果将此LocalDate对象存储到SQL标准DATE列:

myPreparedStatment.setObject( … , ld ) ;

检索:

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

如果存储到SQL标准TIMESTAMP WITH TIME ZONE列,我们需要一个日期时间值而不是我们的仅日期值。也许你想在那一天使用当天的第一时刻?如果是这样,让 java.time 确定第一时刻。不要假设00:00。夏令时(DST)等异常意味着该日可能会在另一个时间开始,例如01:00。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;  // First moment of the day for that date for the people in India.

大多数数据库通过调整为UTC来存储分区日期时刻。您的JDBC驱动程序和数据库可能会为您执行此操作,或者您可以从Instant中提取UTC值(ZonedDateTime)。

Instant instant = zdt.toInstant() ;  // Adjust from zoned time to UTC time.

myPreparedStatment.setObject( … , instant ) ;

检索:

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 7 :(得分:0)

如果要在给定date format的db中保存日期,可以使用

DateFormat df = new SimpleDateFormat("yyyy.MM.dd");

    Date date3 = Calendar.getInstance().getTime();

    String startDate = df.format(date3);

    try {

    java.sql.Date date = new java.sql.Date(df.parse(startDate).getTime());

    System.out.println(date);

    } catch (ParseException ex) {
      Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
    }

答案 8 :(得分:-1)

这很简单

SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd");
format.parse(dateObject.toString());