英文:
DB and java time date comparison and conversion
问题
Sure, here's the translated code snippet:
public void reTrigger() {
Date date1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH.mm.ss");
String squery = "select newValue from SAVE_TXN WHERE ROWID = 1"; // newValue is of type nvarchar2
String newValue = parser.getValueOf("newValue"); // parser is another method which parses the squery
String vidtime = sdf.format(newValue);
String currentDate = sdf.format(date1);
try {
Date vidDate = sdf.parse(vidtime);
Date currentDateParsed = sdf.parse(currentDate);
long timeDifferenceMillis = currentDateParsed.getTime() - vidDate.getTime();
long hoursDifference = timeDifferenceMillis / (60 * 60 * 1000);
if (hoursDifference >= 120) {
// The time difference is greater than or equal to 120 hours
// Your code logic here
} else {
// The time difference is less than 120 hours
// Your code logic here
}
} catch (ParseException e) {
e.printStackTrace();
// Handle parsing exception
}
}
Please note that the provided code assumes that the parser.getValueOf("newValue")
method returns a valid date-time string in the format 'yyyy/MM/dd HH.mm.ss'
. The code then parses both the fetched newValue
and the current date, calculates the time difference in hours, and performs the comparison to check if the time difference is greater than or equal to 120 hours.
英文:
I am getting a variable newValue
in java as
public void reTrigger() {
Date date1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH.mm.ss");
squery: "select newValue from SAVE_TXN WHERE ROWID = 1"
(newValue is of type nvarchar2)
String vidtime = sdf.format(parser.getValueOf("newValue")); //parser is another method which parses the squery
String currentDate = sdf.format(date1);
}
Now newvalue contains date and time like: '2020/05/17 18.30.44'
in DB, which I am fetching into vidtime.
Now I want to subtract this vidtime with currentDate in java and check whether it is greater than or equals to 120 hours or not. How to proceed ?
答案1
得分: 3
你正在使用多年前被现代 java.time 类取代的糟糕的日期时间类,这是在采纳 JSR 310 时完成的。
从数据库中检索日期时间值时,应该将其作为日期时间对象而不是字符串进行。从 JDBC 4.2 开始,我们可以在数据库中使用 java.time 类。请参阅 PreparedStatement::setObject
和 ResultSet::getObject
。
对于类型为:
-
TIMESTAMP WITH TIME ZONE
的数据库列,应检索为OffsetDateTime
(遗憾的是,JDBC 4.2 中没有支持更常用的Instant
和ZonedDateTime
类)。 -
TIMESTAMP WITHOUT TIME ZONE
的数据库列,应检索为LocalDateTime
。
如果面对字符串输入,可以使用 DateTimeFormatter
类进行解析。
您的输入缺少时区或偏移量指示器。因此,我们必须将其解析为 LocalDateTime
。
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu/MM/dd HH.mm.ss");
LocalDateTime ldt = LocalDateTime.parse(input, f);
捕获当前时刻需要一个时区。对于任何给定的时刻,日期和每天的时间因时区而异。
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime now = ZonedDateTime.now(z);
我们无法将当前时刻(zdt
)与您的输入 ldt
进行比较。您的输入和 LocalDateTime
对象并不代表一个时刻,它们不是时间线上的特定点。以您的示例 2020/05/17 18.30.44
为例。我们无法确定这是指东京、图卢兹还是托莱多的当地时间下午 6:30,这些是时间线上几个小时之间的不同时刻。
因此,根据您提供的内容,问题无法解决。
如果您确切知道输入字符串的时区意图,请应用时区以生成 ZonedDateTime
。
ZoneId zIntended = ZoneOf.of("Africa/Tunis");
ZonedDateTime then = ldt.atZone(zIntended);
将经过的时间计算为 Duration
。
Duration d = Duration.between(now, then);
if (d.toHours() > 120) { ... }
英文:
You are using terrible date-time classes that were years ago supplanted by the modern java.time classes with the adoption of JSR 310.
You should be retrieving date-time values from the database as date-time objects rather than strings. As of JDBC 4.2, we can exchange java.time classes with the database. See PreparedStatement::setObject
and ResultSet::getObject
.
For a database column of type:
-
TIMESTAMP WITH TIME ZONE
, retrieve as aOffsetDateTime
(support for the more commonly usedInstant
andZonedDateTime
classes was unfortunately and mysteriously omitted from JDBC 4.2). -
TIMESTAMP WITHOUT TIME ZONE
, retrieve as aLocalDateTime
.
If faced with a string input, parse using DateTimeFormatter
class.
Your input lacks an indicator of time zone or offset-from-UTC. So we must parse as a LocalDateTime
.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu/MM/dd HH.mm.ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
Capturing the current moment requires a time zone. For any given moment, the date and the time-of-day vary around the globe by zone.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
We cannot compare this current moment (zdt
) to your input, the ldt
. Your input and a LocalDateTime
object do not represent a moment, are not a specific point on the timeline. Take your example, 2020/05/17 18.30.44
. We cannot know if that means 6:30 PM on the 17th in Tokyo, in Toulouse, or in Toledo – all different moments, several hours apart on the timeline.
So your Question as written cannot be solved.
If you know for certain that a time zone was intended for your input string, apply a time zone to produce a ZonedDateTime
.
ZoneId zIntended = ZoneOf.( "Africa/Tunis" ) ;
ZonedDateTime then = ldt.atZone( zIntended ) ;
Calculate elapsed time as a Duration
.
Duration d = Duration.between( now , then ) ;
if( d.toHours() > 120 ) { … }
答案2
得分: 1
也许类似这样的:
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
public static void main(String[] args) {
final LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
final LocalDateTime dateToCompare = LocalDateTime.parse("2020-05-28 02:05:45", formatter);
final long hours = Duration.between(now, dateToCompare).toHours();
System.out.print(hours);
}
}
英文:
Maybe something like this :
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
public static void main(String[] args) {
final LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
final LocalDateTime dateToCompare = LocalDateTime.parse("2020-05-28 02:05:45",formatter);
final long hours = Duration.between(now, dateToCompare).toHours();
System.out.print(hours);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论