我想得到当前时间(即IST)和存储在DB(EST)中的时间的差异。为了那个我试图在计算差异之前将当前时间转换为EST。但它不起作用。在以下方法中,
当地时间不会转换为EST。你能告诉我更好的方法吗?
getModifiedDate
的返回类型为java.sql.Timestamp
和数据类型
列的列为DATE
代码:
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("EST"));
cal.setTimeInMillis(System.currentTimeMillis());
cal.getTimeInMillis() - emp.getModifiedDate().getTime();
我试图使用SimpleDateFormat
来做,但我不知道如何继续这种方法。
如果您可以提供有用的代码段
答案 0 :(得分:2)
如果您可以访问Java 8,那么直接计算两个日期之间的差异可能同样容易,而不是先调整到目标时区。
您可以使用java.time
包中的ZonedDateTime
执行此操作:
// Our timestamp
Timestamp ts = emp.getModifiedDate();
// Convert timestamp to ZonedDateTime in the correct time zone
ZonedDateTime estTime = ts.toLocalDateTime().atZone(ZoneId.of("America/New_York"));
// Could pass in ZoneId.of("Asia/Kolkata") argument to now(...), but not required
// as "now" is the same instant in all time zones.
ZonedDateTime zonedNow = ZonedDateTime.now();
// Can use other ChronoUnit values if required.
long timeDiff = ChronoUnit.MILLIS.between(zonedNow, estTime);
// Use timeDiff as required
答案 1 :(得分:2)
您可以使用 java.time.Duration
找到它,它以 ISO-8601 standards 为模型,并作为 JSR-310 implementation 的一部分与 Java-8 一起引入。 Java-9 引入了一些更方便的方法。
import java.time.Duration;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(formatDuration(diffBetweenTimeZones("Asia/Kolkata", "America/New_York")));
System.out.println(formatDuration(diffBetweenTimeZones("America/New_York", "Asia/Kolkata")));
// You can use the returned value to get the ZoneOffset which you can use for
// other processing e.g.
ZoneOffset offset = ZoneOffset.of(formatDuration(diffBetweenTimeZones("Asia/Kolkata", "America/New_York")));
System.out.println(offset);
System.out.println(OffsetDateTime.now(offset));
}
static Duration diffBetweenTimeZones(String tz1, String tz2) {
LocalDate today = LocalDate.now();
return Duration.between(today.atStartOfDay(ZoneId.of(tz1)), today.atStartOfDay(ZoneId.of(tz2)));
}
static String formatDuration(Duration duration) {
long hours = duration.toHours();
long minutes = duration.toMinutes() % 60;
String symbol = hours < 0 || minutes < 0 ? "-" : "+";
return String.format(symbol + "%02d:%02d", Math.abs(hours), Math.abs(minutes));
// ####################################Java-9####################################
// return String.format(symbol + "%02d:%02d", Math.abs(duration.toHoursPart()),
// Math.abs(duration.toMinutesPart()));
// ####################################Java-9####################################
}
}
输出:
+09:30
-09:30
+09:30
2021-03-24T19:52:29.474858+09:30
从 Trail: Date Time 了解有关现代日期时间 API 的更多信息。
请注意,java.util
日期时间 API 已过时且容易出错。建议完全停止使用,切换到modern date-time API*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 2 :(得分:1)
您可以尝试java.util.TimeZone
long now = System.currentTimeMillis();
long diff = TimeZone.getTimeZone("IST").getOffset(now) - TimeZone.getTimeZone("EST").getOffset(now);
getOffset - 在指定日期返回此时区与UTC的偏移量
答案 3 :(得分:1)
我建议使用java.time
JDK 8
API,这在很大程度上简化了这一点。请考虑以下示例:
Timestamp t = emp.getModifiedDate();
Duration.between(t.toInstant(), ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).toInstant());
从数据库检索到的时间戳已转换为Instant
UTC
,同样Asia/Kolkata
区域中的当前时间已转换为Instant
和{{已经计算了两者之间的1}}。您可以从持续时间中检索所需的信息。
答案 4 :(得分:0)
TimeZone有两个方法getRawOffet
和getOffset
,它们以毫秒为单位检索时区到UTC的偏移量。第二个调整为夏令时,并请求日期检查它是否有效。
TimeZone current = TimeZone.getDefault();
TimeZone db = TimeZone.getTimeZone("US/Eastern"); // or "EST5EDT", or "America/New_York"
System.out.printf("DB: %s Current: %s\n", db, current);
System.out.printf("Raw: %.1f h\n", (db.getRawOffset() - current.getRawOffset())/3_600_000D);
final long now = System.currentTimeMillis();
System.out.printf("DST: %.1f h\n", (db.getOffset(now) - current.getOffset(now))/3_600_000D);