我正在开发和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?
答案 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)
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的偏移量。所以你不能用它来从莫斯科时间(或任何其他时间)获得抵消。
另外,请考虑抛弃那些已经过时且臭名昭着的DateFormat
和SimpleDateFormat
以及同样过时的朋友Date
和Calendar
。 java.time
,现代Java日期和时间API可以更好地使用。
java.time
。答案 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);