在java中将日期格式转换为特定格式的日期对象
我使用在java中将日期格式转换为特定格式的日期对象,java,date,Java,Date,我使用Date date3=Calendar.getInstance().getTime()查找当前时间 这给了我2012年10月25日星期四11:42:22 现在,我希望我的日期的格式为2012.10.25,并且也是作为日期对象,而不是字符串 String output = ld.format( f ) ; // Generate a string in this custom format. 我试着使用下面的代码 DateFormat df = new SimpleDateFormat(
Date date3=Calendar.getInstance().getTime()查找当前时间代码>
这给了我2012年10月25日星期四11:42:22
现在,我希望我的日期的格式为2012.10.25
,并且也是作为日期对象,而不是字符串
String output = ld.format( f ) ; // Generate a string in this custom format.
我试着使用下面的代码
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
,也可以将其设置为日期格式呢。日期对象是必需的,因为它将作为日期字段保存在数据库中。您需要使用方法以所需格式获取日期。日期对象没有任何格式。i、 e.不能将任何日期对象转换为特定格式。因为它有自己的to字符串格式,在打印任何日期时都会返回。您只能转换任何字符串格式
您可以从特定格式的日期字符串转换或构造任何日期对象。但该日期对象不会采用特定格式。您的问题就像在问:
我有一个值为1234567的int变量,我希望它在该变量中存储为“1234567”
这根本不合理
值的存储方式与值的表示方式无关。如果要在给定的数据库中保存日期,可以使用
Date date3 = Calendar.getInstance().getTime();
SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");
System.out.println(df.format(date3));
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);
}
Date类没有“内部”格式,它只表示日期元素。要使用特定的格式输出它,您需要执行以下操作:String tDate=formatter1.format(date)
您认为它具有“错误格式”的原因可能是,当您尝试输出它时,它在默认情况下会执行toString(),而这并不是您想要的格式
如果您向我们提供有关如何使用该日期(包括您的代码)的更多详细信息,那么我们可能能够提供有关如何将格式化程序注入该日期的建议
日期本身不存储任何格式信息。非常简单
SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd");
format.parse(dateObject.toString());
tl;博士
避免糟糕的遗留日期时间类(date
,SimpleDateFormat
)。仅使用现代java.time类
2012.10.25
要将当前日期的仅日期值插入数据库,请执行以下操作:
myPreparedStatement.setObject(
… ,
LocalDate.now( ZoneId.of( "India/Kolkata" ) )
) ;
将日期时间值与字符串混淆
日期时间值没有“格式”。只有字符串具有格式。不要把两者混为一谈。可以通过解析字符串来实例化日期时间对象。日期时间对象可以生成一个字符串,以文本形式表示其值。但是date-time对象和这些字符串仍然是独立的
它再次给我提供了2012年10月25日星期四00:00:00
。这实际上是因为toString()函数的实现方式显示了这种格式
否,toString
方法不会“显示”此格式。该措辞意味着格式存在于Date
对象中。但是格式不存在于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.
您的输入字符串采用非标准格式。恰好是同一年、月、日的顺序,所以我将用连字符替换句点
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.
当前日期
时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”
如果未指定时区,JVM将隐式应用其当前默认时区。该默认值可能随时更改,因此您的结果可能会有所不同。最好将所需/预期时区明确指定为参数
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
如果要使用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
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性
数据库
从JDBC4.2及更高版本开始,我们可以直接与数据库交换java.time对象
如果将此LocalDate
对象存储到SQL标准DATE
列:
myPreparedStatment.setObject( … , ld ) ;
和检索:
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
如果使用时区列存储到SQL标准时间戳,则需要日期时间值,而不是仅日期值。也许你想利用那天的第一刻?如果是这样,让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.
大多数da
LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ; // First moment of the day for that date for the people in India.
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 ) ;