我使用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中。
答案 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)
避免可怕的遗留日期时间类(Date
,SimpleDateFormat
)。仅使用现代 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/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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());