获取俄罗斯时间和当前手机时间之间的差异

时间:2018-06-05 22:01:51

标签: java android

我正在开发和Android应用程序,我正在尝试查找我的设备和俄罗斯当地时间之间的当前时间差异。

我设法将设备时间与GMT区分开来,如下所示

        Calendar cc = Calendar.getInstance(TimeZone.getTimeZone("GMT"), 
              Locale.getDefault());
        Date currentLocalTime = cc.getTime();
        DateFormat xdate = new SimpleDateFormat("Z");
        String timetime = xdate.format(currentLocalTime);
        Log.i("out","OFF SET FROM GMT " + timetime);

我尝试将GMT更改为MSK,但这不起作用。

如何将输出设为MSK +/- x?

5 个答案:

答案 0 :(得分:2)

这很容易在两个时区之间产生差异。我们知道 GMT + 3 时区的莫斯科:

ZonedDateTime utcTime = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime moscowTime = ZonedDateTime.now(ZoneId.of("Europe/Moscow"));
int utcOffs = utcTime.getOffset().getTotalSeconds();
int moscowOffs = moscowTime.getOffset().getTotalSeconds();
double hoursOffs = (moscowOffs - utcOffs) / 3600.0; // hoursOffs = 3.0

<强> P.S。 不使用java.time

Calendar utcTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Calendar moscowTime = Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow"));
int utcOffs = utcTime.getTimeZone().getRawOffset();
int moscowOffs = moscowTime.getTimeZone().getRawOffset();
double hoursOffs = (moscowOffs - utcOffs) / 1000 / 3600.0; // hoursOffs = 3.0

答案 1 :(得分:1)

java.time

    Instant now = Instant.now();
    ZoneOffset deviceOffset = now.atZone(ZoneId.systemDefault()).getOffset();
    ZoneOffset russiaOffset = now.atZone(ZoneId.of("Europe/Moscow")).getOffset();
    int diffSeconds = deviceOffset.getTotalSeconds() - russiaOffset.getTotalSeconds();
    Duration diff = Duration.ofSeconds(diffSeconds);
    System.out.format(Locale.getDefault(),
            "Current offset between device time and Moscow time: %+03d%02d%n",
            diff.toHours(), diff.toMinutesPart());

今天在欧洲/哥本哈根时区运行上述内容我得到了:

  

设备时间与莫斯科时间之间的当前偏移:-0100

由于丹麦目前正处于夏令时(DST),因此抵消+0200,莫斯科处于+0300(全年),因此输出正确。

由于俄罗斯正在使用11个不同的时区,因此“俄罗斯时间”含糊不清。底部有一个列表链接。你提到了MSK,所以我认为你的意思是莫斯科时间。但是,您不应该依赖三个或四个字母的时区缩写,至少不在您的代码中。虽然MSK可能是明确的,但缩写不是标准化的,并且其中很多都是模棱两可的。而是将时区划为欧洲/莫斯科(或亚洲/ Srednekolymsk等)。

我正在使用的toMinutesPart方法是在Java 9中引入的。对于Java 6到8,您需要从持续时间中减去小时数,然后使用toMinutes

为什么你的方法不起作用?

格式化程序中的模式字母Z始终为您提供与UTC的偏移量。所以你不能用它来从莫斯科时间(或任何其他时间)获得抵消。

另外,请考虑抛弃那些已经过时且臭名昭着的DateFormatSimpleDateFormat以及同样过时的朋友DateCalendarjava.time,现代Java日期和时间API可以更好地使用。

链接

答案 2 :(得分:0)

你需要做的就是这个,

LocalDateTime.now(ZoneId.of("Europe/Moscow"));

另一种解决方案:

final SimpleDateFormat dateFormatter =
    new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z");
dateFormatter.setTimeZone(TimeZone.getTimeZone("Europe/Moscow"));
System.out.println("MSK Time: " + dateFormatter.format(new Date()));

答案 3 :(得分:0)

我解决了这个问题归功于Mihai Adrian,如下所示

 long now = System.currentTimeMillis();

        String tzx = "Europe/Moscow";
        TimeZone mTimeZone = TimeZone.getTimeZone(tzx);
        int remote = mTimeZone.getOffset(now);

        TimeZone mTimeZone2 = TimeZone.getDefault();
        int local = mTimeZone2.getOffset(now);

        double differenceInHours = (local - remote) / 3600000.0;

        double number = differenceInHours;
        int value_h = (int) number;
        double frac = number - value_h;
        int value_m=(int) (frac*60);
        String result=value_h+" and " +value_m;

答案 4 :(得分:0)

您可以执行以下操作, 使用所需时区的日历并获取该区域的小时和日期。以获得小时差异减去时区的小时差异。

    Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    c.setTimeInMillis(new Date().getTime());

    int GmtHourOfDay = c.get(Calendar.HOUR_OF_DAY);
    int GmtDayOfMonth = c.get(Calendar.DAY_OF_MONTH);


    c = new GregorianCalendar(TimeZone.getTimeZone("Europe/Moscow"));
    c.setTimeInMillis(new Date().getTime());

    int RussHourOfDay = c.get(Calendar.HOUR_OF_DAY);
    int RussDayOfMonth = c.get(Calendar.DAY_OF_MONTH);

    int hourDifference = GmtHourOfDay - RussHourOfDay;
    int dayDifference = GmtDayOfMonth - RussDayOfMonth;
    if (dayDifference != 0) {
    hourDifference = hourDifference + 24;
    }
    System.out.println(hourDifference);