使用 SimpleDateFormat 转换微秒
Usage of SimpleDateFormat for converting microseconds
我在数据库中有以下格式的日期数据:
07-FEB-18 09.43.51.712992 AM
但是传入的输入格式是:
2018-02-07T09:43:51.712992
所以我将我的输入转换为预期的格式,以便能够检查 db 值。这是我的部分代码片段。
public class Main{
public static void main(String[] args){
DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSS aa",Locale.ENGLISH);
strDate = "2018-02-07T09:43:51.712992"
String year = strDate.substring(2,4);
String month = CommonUtil.getMonthValueWithLetters(strDate.substring(5,7));
String day = strDate.substring(8,10);
String hour = CommonUtil.convertToPMAM(strDate.substring(11,13)).keySet().iterator().next();
String min = strDate.substring(14,16);
String second = strDate.substring(17,19);
String milliSecond = strDate.substring(20,26);
String AMPM = CommonUtil.convertToPMAM(strDate.substring(11,13)).values().iterator().next();
String convertedStrDate = day + "-" + month + "-" + year + " " + hour + "." + min + "." + second + "." + milliSecond + " " + AMPM; //07-FEB-18 09.43.51.712992 AM
Date timeStamp = dateFormat.parse(convertedStrDate); //Wed Feb 07 09:55:43 GMT+04:00 2018
}
}
public class Commonutil{
public static String getMonthValueWithLetters(String month){
switch(month){
case "01": return "JAN";
case "02": return "FEB";
case "03": return "MAR";
case "04": return "APR";
case "05": return "MAY";
case "06": return "JUN";
case "07": return "JUL";
case "08": return "AUG";
case "09": return "SEP";
case "10": return "OCT";
case "11": return "NOV";
case "12": return "DEC";
default : return null;
}
}
public static Map<String, String> convertToPMAM(String hour){
Map<String, String> keyValues = new HashMap<String, String>();
int value = Integer.parseInt(hour);
if( value <=12){
keyValues.put(hour, "AM");
return keyValues;
}else{
int temp = value - 12;
if(temp<10){
keyValues.put("0"+String.valueOf(value-12),"PM");
}
else{
keyValues.put(String.valueOf(value-12), "PM");
}
}
return keyValues;
}
}
似乎 parse 方法也转换微秒,所以每当我将此值传递给数据库时,都无法根据数据库中的值检查它。那么有什么方法可以将我的传入日期值转换为数据库中显示的所需格式?
为了您的信息,我正在使用 jdbc 和 oracle 数据库。
java.util.Date
只有毫秒级的精度。如果在处理数据库时需要更高的精度(低至一纳秒),则必须改用 java.sql.Timestamp
class。通过替换输入格式中日期和时间之间的 'T' 分隔符,您可以将字符串直接提供给工厂方法并获得预期结果:
Timetstamp t = Timestamp.valueOf("2018-02-07T09:43:51.712992".replace('T', ' '));
然后您可以直接在 JDBC 语句中使用时间戳。
如果您想将该字符串传递给 Oracle,可以将其转换为时间戳:
select TO_TIMESTAMP('2018-02-07T09:43:51.712992', 'YYYY-MM-DD"T"HH:MI:SS.FF6') from dual;
或者,在字符串中添加时区:
select TO_TIMESTAMP_TZ('2018-02-07T09:43:51.712992 -5:00', 'YYYY-MM-DD"T"HH:MI:SS.FF6 TZH:TZM') from dual;
将 "T" 分隔符放在双引号中可能是不明显的棘手部分。 Oracle 格式文档是 here. The timezone support docs are here.
据我了解你的问题,你得到的输入格式类似于 2018-02-07T09:43:51.712992
,你需要将此输入与 Oracle 数据库中的时间戳进行比较。
您的输入字符串符合 ISO 8601。java.time
的 类,现代 Java 日期和时间 API,将 ISO 8601 格式解析为默认格式,也就是说,没有任何明确的格式化程序。这使得解析您的输入变得容易:
String inputString = "2018-02-07T09:43:51.712992";
LocalDateTime inputDateTime = LocalDateTime.parse(inputString);
使用 JDBC 4.2 兼容的 JDBC driver(您可能已经拥有并且至少可以为您的 Oracle 数据库获取)您可以直接传递此 LocalDateTime
您的查询。我假设您的查询表示为 Java 中的 PreparedStatement
。例如:
yourPreparedStatement.setObject(1, inputDateTime);
现在您可以在查询中直接将输入值与数据库中的时间戳进行比较。不需要你的格式转换。
但作为对您标题的回答:不,SimpleDateFormat
不支持微秒。精度只有毫秒
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
我在数据库中有以下格式的日期数据:
07-FEB-18 09.43.51.712992 AM
但是传入的输入格式是:
2018-02-07T09:43:51.712992
所以我将我的输入转换为预期的格式,以便能够检查 db 值。这是我的部分代码片段。
public class Main{
public static void main(String[] args){
DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy HH.mm.ss.SSSSSS aa",Locale.ENGLISH);
strDate = "2018-02-07T09:43:51.712992"
String year = strDate.substring(2,4);
String month = CommonUtil.getMonthValueWithLetters(strDate.substring(5,7));
String day = strDate.substring(8,10);
String hour = CommonUtil.convertToPMAM(strDate.substring(11,13)).keySet().iterator().next();
String min = strDate.substring(14,16);
String second = strDate.substring(17,19);
String milliSecond = strDate.substring(20,26);
String AMPM = CommonUtil.convertToPMAM(strDate.substring(11,13)).values().iterator().next();
String convertedStrDate = day + "-" + month + "-" + year + " " + hour + "." + min + "." + second + "." + milliSecond + " " + AMPM; //07-FEB-18 09.43.51.712992 AM
Date timeStamp = dateFormat.parse(convertedStrDate); //Wed Feb 07 09:55:43 GMT+04:00 2018
}
}
public class Commonutil{
public static String getMonthValueWithLetters(String month){
switch(month){
case "01": return "JAN";
case "02": return "FEB";
case "03": return "MAR";
case "04": return "APR";
case "05": return "MAY";
case "06": return "JUN";
case "07": return "JUL";
case "08": return "AUG";
case "09": return "SEP";
case "10": return "OCT";
case "11": return "NOV";
case "12": return "DEC";
default : return null;
}
}
public static Map<String, String> convertToPMAM(String hour){
Map<String, String> keyValues = new HashMap<String, String>();
int value = Integer.parseInt(hour);
if( value <=12){
keyValues.put(hour, "AM");
return keyValues;
}else{
int temp = value - 12;
if(temp<10){
keyValues.put("0"+String.valueOf(value-12),"PM");
}
else{
keyValues.put(String.valueOf(value-12), "PM");
}
}
return keyValues;
}
}
似乎 parse 方法也转换微秒,所以每当我将此值传递给数据库时,都无法根据数据库中的值检查它。那么有什么方法可以将我的传入日期值转换为数据库中显示的所需格式?
为了您的信息,我正在使用 jdbc 和 oracle 数据库。
java.util.Date
只有毫秒级的精度。如果在处理数据库时需要更高的精度(低至一纳秒),则必须改用 java.sql.Timestamp
class。通过替换输入格式中日期和时间之间的 'T' 分隔符,您可以将字符串直接提供给工厂方法并获得预期结果:
Timetstamp t = Timestamp.valueOf("2018-02-07T09:43:51.712992".replace('T', ' '));
然后您可以直接在 JDBC 语句中使用时间戳。
如果您想将该字符串传递给 Oracle,可以将其转换为时间戳:
select TO_TIMESTAMP('2018-02-07T09:43:51.712992', 'YYYY-MM-DD"T"HH:MI:SS.FF6') from dual;
或者,在字符串中添加时区:
select TO_TIMESTAMP_TZ('2018-02-07T09:43:51.712992 -5:00', 'YYYY-MM-DD"T"HH:MI:SS.FF6 TZH:TZM') from dual;
将 "T" 分隔符放在双引号中可能是不明显的棘手部分。 Oracle 格式文档是 here. The timezone support docs are here.
据我了解你的问题,你得到的输入格式类似于 2018-02-07T09:43:51.712992
,你需要将此输入与 Oracle 数据库中的时间戳进行比较。
您的输入字符串符合 ISO 8601。java.time
的 类,现代 Java 日期和时间 API,将 ISO 8601 格式解析为默认格式,也就是说,没有任何明确的格式化程序。这使得解析您的输入变得容易:
String inputString = "2018-02-07T09:43:51.712992";
LocalDateTime inputDateTime = LocalDateTime.parse(inputString);
使用 JDBC 4.2 兼容的 JDBC driver(您可能已经拥有并且至少可以为您的 Oracle 数据库获取)您可以直接传递此 LocalDateTime
您的查询。我假设您的查询表示为 Java 中的 PreparedStatement
。例如:
yourPreparedStatement.setObject(1, inputDateTime);
现在您可以在查询中直接将输入值与数据库中的时间戳进行比较。不需要你的格式转换。
但作为对您标题的回答:不,SimpleDateFormat
不支持微秒。精度只有毫秒
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.