两个不同时区的时差

时间:2017-06-30 04:11:09

标签: java timezone datetime-conversion

我想得到当前时间(即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来做,但我不知道如何继续这种方法。

如果您可以提供有用的代码段

5 个答案:

答案 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 desugaringHow 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有两个方法getRawOffetgetOffset,它们以毫秒为单位检索时区到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);