即使您选择任何TimeZone,以秒为单位的时间也相同?

问题描述 投票:0回答:2

在使用TimeZone“Europe / Warsaw”后,我使用以下功能在几秒钟内获得时间。

我正确地获得了日期,但是只要我在几秒钟内转换日期,我的输出就会出错。服务器在TimeZone“Europe / Warsaw”中预计秒数。什么是最好的方法摆脱这个?

public static long getTimeInSeconds() {
    try {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //Here you say to java the initial timezone. This is the secret
        sdf.setTimeZone(TimeZone.getTimeZone("Europe/Warsaw"));

        //Will get in Warsaw time zone
        String date = sdf.format(calendar.getTime());

        Date date1 = sdf.parse(date);

        //Convert time in seconds as required by server.
        return (date1.getTime() / 1000);

    } catch (ParseException e) {
        e.printStackTrace();
    }

    return 0;
}
java datetime timezone epoch
2个回答
4
投票

“TimeZone中的秒”没有意义,因为纪元秒意味着“自纪元以来的秒数”(其中纪元是1970年1月1日在UTC的午夜),无论时区如何。

这个价值在世界各地都是一样的。但是,相同的纪元秒值可以转换为本地日期和时间,具体取决于时区。

示例:现在,epoch第二个值是1520352472.这个相同的值(自纪元以来的1520352472秒),在世界各地都是一样的。但是,此值可以表示每个时区中的不同日期和时间:

  • 2018年3月6日,UTC时间16:07:52
  • 2018年3月6日,13:07:52在圣保罗(巴西)
  • 2018年3月7日,01:07:52在东京

问题是:无论我在哪个时区,epoch秒值都是相同的,所以你根本不需要考虑任何时区。

java.util.Datedoesn't have any notion of timezone也是,它只包含一个long值,表示自纪元以来的毫秒数。所以,如果你有一个Date对象,只需使用这个值并除以1000:

long epochSeconds = new Date().getTime() / 1000;

实际上,如果你只想要当前日期/时间的数值,你甚至不需要创建一个Date来获取它:

long epochSeconds = System.currentTimeMillis() / 1000;

0
投票

您需要在从日历中获取时间后设置时区

public static long getTimeInSeconds() {

    try {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //Will get in Warsaw time zone
        String date = sdf.format(calendar.getTime());

        //Here you say to java the initial timezone. This is the secret
        sdf.setTimeZone(TimeZone.getTimeZone("Europe/Warsaw"));

        Date date1 = sdf.parse(date);

        //Convert time in seconds as required by server.
        return (date1.getTime() / 1000);

    } catch (ParseException e) {
        e.printStackTrace();
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.