我尝试将String转换为TimeStamp时遇到问题。我有一个日期格式为yyyy-MM-dd
的数组,我希望以yyyy-MM-dd HH:mm:ss.SSS
的格式进行更改。所以,我使用这段代码:
final String OLD_FORMAT = "yyyy-MM-dd";
final String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
String oldDateString = createdArray[k];
String newDateString;
DateFormat formatter = new SimpleDateFormat(OLD_FORMAT);
Date d = formatter.parse(oldDateString);
((SimpleDateFormat) formatter).applyPattern(NEW_FORMAT);
newDateString = formatter.format(d);
System.out.println(newDateString);
Timestamp ts = Timestamp.valueOf(newDateString);
System.out.println(ts);
我得到以下结果。
2009-10-20 00:00:00.000
2009-10-20 00:00:00.0
但是当我尝试简单地做
时String text = "2011-10-02 18:48:05.123";
ts = Timestamp.valueOf(text);
System.out.println(ts);
我得到了正确的结果:
2011-10-02 18:48:05.123
你知道我可能做错了什么吗? 谢谢你的帮助。
答案 0 :(得分:88)
请按照以下步骤获得正确的结果:
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
Date parsedDate = dateFormat.parse(yourString);
Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
} catch(Exception e) { //this generic but you can control another types of exception
// look the origin of excption
}
请注意,.parse(String)
可能会引发ParseException
。
答案 1 :(得分:10)
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Util{
public static Timestamp convertStringToTimestamp(String str_date) {
try {
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
// you can change format of date
Date date = formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
return timeStampDate;
} catch (ParseException e) {
System.out.println("Exception :" + e);
return null;
}
}
}
答案 2 :(得分:8)
我想提供现代答案。在2013年提出此问题时,使用Timestamp
类是正确的,例如将日期时间存储到数据库中。今天班级已经过时了。在三年半前的2014年春天,Java 8发布了现代Java日期和时间API。我建议你改用它。
根据您的情况确切要求,Timestamp
有两种自然替代品:
Instant
是时间线上的一个点。在大多数情况下,我认为使用它最安全。 Instant
与时区无关,即使客户端设备和数据库服务器运行不同的时区,通常也能正常运行。LocalDateTime
是没有时区的日期和时间,例如2011-10-02 18:48:05.123(引用问题)。现代JDBC驱动程序(JDBC 4.2或更高版本)和其他用于数据库访问的现代工具将很乐意将Instant
或LocalDateTime
存储到数据类型timestamp
的数据库列中。我在本答案中使用的类和其他日期时间类都属于称为java.time
或JSR-310的现代API。
将字符串转换为LocalDateTime
是最简单的,所以我们先来看看:
DateTimeFormatter formatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
String text = "2011-10-02 18:48:05.123";
LocalDateTime dateTime = LocalDateTime.parse(text, formatter);
System.out.println(dateTime);
打印
2011-10-02T18:48:05.123
如果您的字符串采用yyyy-MM-dd格式,请执行:
String text = "2009-10-20";
LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
System.out.println(dateTime);
打印
2009-10-20T00:00
或者更好的是,从LocalDate.parse()
获取输出并将其存储到数据类型为date
的数据库列中。
在这两种情况下,从LocalDateTime
转换为Instant
的程序为:
Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
System.out.println(ts);
我已经使用JVM的默认时区指定了转换,因为这是过时的类将使用的。但这很脆弱,因为时区设置可能会被程序的其他部分或同一JVM中运行的其他程序改变。如果可以,请改为指定 region / city 格式的时区,例如:
Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();
答案 3 :(得分:3)
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date date = formatter.parse(dateString);
Timestamp timestamp = new Timestamp(date.getTime());
System.out.println(timestamp);
答案 4 :(得分:2)
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());
答案 5 :(得分:1)
首先将您的日期字符串转换为date
,然后使用以下一行将其转换为timestamp
Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;
答案 6 :(得分:1)
将String转换为java.sql.Timestamp的简单方法:
Timestamp t = new Timestamp(DateUtil.provideDateFormat().parse("2019-01-14T12:00:00.000Z").getTime());
DateUtil.java:
import java.text.SimpleDateFormat;
import java.util.TimeZone;
public interface DateUtil {
String ISO_DATE_FORMAT_ZERO_OFFSET = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
String UTC_TIMEZONE_NAME = "UTC";
static SimpleDateFormat provideDateFormat() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ISO_DATE_FORMAT_ZERO_OFFSET);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone(UTC_TIMEZONE_NAME));
return simpleDateFormat;
}
}
答案 7 :(得分:1)
仅出于完整性考虑,这是一个使用lambda和方法参考的解决方案:
说明: 以下方法
String
与模式yyyy-MM-dd
转换为Timestamp
,null
值,则返回null
,DateTimeParseException
代码:
static Timestamp convertStringToTimestamp(String strDate) {
return Optional.ofNullable(strDate) // wrap the String into an Optional
.map(str -> LocalDate.parse(str).atStartOfDay()) // convert into a LocalDate and fix the hour:minute:sec to 00:00:00
.map(Timestamp::valueOf) // convert to Timestamp
.orElse(null); // if no value is present, return null
}
验证:
可以使用以下单元测试来测试此方法:
(带有 Junit5 和 Hamcrest )
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
// given
String strDate = "2020-01-30";
// when
final Timestamp result = convertStringToTimestamp(strDate);
// then
final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
assertThat(dateTime.getYear(), is(2020));
assertThat(dateTime.getMonthValue(), is(1));
assertThat(dateTime.getDayOfMonth(), is(30));
}
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenInvalidInput() {
// given
String strDate = "7770-91-30";
// when, then
assertThrows(DateTimeParseException.class, () -> convertStringToTimestamp(strDate));
}
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenNullInput() {
// when
final Timestamp result = convertStringToTimestamp(null);
// then
assertThat(result, is(nullValue()));
}
通常,要解析的字符串带有另一种格式。处理它的一种方法是使用格式化程序将其转换为另一种格式。这是一个示例:
输入:20200130 11:30
模式:yyyyMMdd HH:mm
输出:此输入的时间戳
代码:
static Timestamp convertStringToTimestamp(String strDate) {
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm");
return Optional.ofNullable(strDate) //
.map(str -> LocalDateTime.parse(str, formatter))
.map(Timestamp::valueOf) //
.orElse(null);
}
测试:
@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
// given
String strDate = "20200130 11:30";
// when
final Timestamp result = convertStringToTimestamp(strDate);
// then
final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
assertThat(dateTime.getYear(), is(2020));
assertThat(dateTime.getMonthValue(), is(1));
assertThat(dateTime.getDayOfMonth(), is(30));
assertThat(dateTime.getHour(), is(11));
assertThat(dateTime.getMinute(), is(30));
}
答案 8 :(得分:0)
你可以尝试一次......
String dob="your date String";
String dobis=null;
final DateFormat df = new SimpleDateFormat("yyyy-MMM-dd");
final Calendar c = Calendar.getInstance();
try {
if(dob!=null && !dob.isEmpty() && dob != "")
{
c.setTime(df.parse(dob));
int month=c.get(Calendar.MONTH);
month=month+1;
dobis=c.get(Calendar.YEAR)+"-"+month+"-"+c.get(Calendar.DAY_OF_MONTH);
}
}
答案 9 :(得分:0)
我确信解决方案是你的oldDateString就像“2009-10-20”。显然,这不包含低于天数的任何时间数据。如果使用新的格式化程序格式化此字符串,应该从哪里获取分钟,秒和毫秒?
所以结果绝对正确:2009-10-20 00:00:00.000
您需要解决此问题的原因是第一次格式化之前的原始时间戳(包括时间数据)。
答案 10 :(得分:0)
这就是我所做的:
Timestamp timestamp = Timestamp.valueOf(stringValue);
其中 stringValue
可以是任何格式的日期/时间。