Java 如何将Android日历设置为航海或军事时区
在我的Android应用程序中,我在不同的时区使用日历。这样我可以调整应用程序的操作 因地制宜Java 如何将Android日历设置为航海或军事时区,java,android,calendar,timezone,military,Java,Android,Calendar,Timezone,Military,在我的Android应用程序中,我在不同的时区使用日历。这样我可以调整应用程序的操作 因地制宜 runDate = Calendar.getInstance(); // will display tides for this date/time useThisTZ = TimeZone.getTimeZone("US/Pacific"); runDate.setTimeZone(useThisTZ); 我需要适应航海或军事时区。这些是地理上的,而不是民事上的。我需要确定可
runDate = Calendar.getInstance(); // will display tides for this date/time
useThisTZ = TimeZone.getTimeZone("US/Pacific");
runDate.setTimeZone(useThisTZ);
我需要适应航海或军事时区。这些是地理上的,而不是民事上的。我需要确定可以传递到getTimeZone函数中的标识符。我尝试了时区代码“A”,它标识了阿尔法时区(UTC+1)。然而,这将日历置于
通常被称为祖鲁的GMT区域
有人知道这些标识符是否可用,以及它们可能是什么。ZoneOffset和OffsetDateTime from java.time
考虑使用java.time(现代java日期和时间API)进行日期和时间工作。航海(或军事)时区仅是UTC整小时的偏移量,因此我们不需要任何考虑夏季时间(DST)和其他异常情况的奇特时区规则,因为根本没有。一个普通的ZoneOffset
就可以了
时区名称不是内置的。我们需要自己编写转换代码。一种方法是通过一个数组,我们可以在其中查找时区名称并获得偏移量:
private static final int[] offsetPerNauticalTimeZone = new int['Z' + 1];
private static final int invalid = -100;
static {
Arrays.fill(offsetPerNauticalTimeZone, invalid);
// The letter "Z" ("Zulu") indicates Coordinated Universal Time (UTC).
offsetPerNauticalTimeZone['Z'] = 0;
// A through M denote positive offsets, but J is skipped
for (int offset = 1; offset <= 9; offset++) {
offsetPerNauticalTimeZone['A' - 1 + offset] = offset;
}
for (int offset = 10; offset <= 12; offset++) {
offsetPerNauticalTimeZone['K' - 10 + offset] = offset;
}
// N through Y are the negative offsets
for (int negatatedOffset = 1; negatatedOffset <= 12; negatatedOffset++) {
offsetPerNauticalTimeZone['N' - 1 + negatatedOffset] = -negatatedOffset;
}
}
刚才我运行这个代码段时,输出是:
2020-09-23T20:05:52.451+01:00
您注意到偏移量为+01:00,对应于航海时区A。请尝试其他时区
如果字符超出大写字母Z
,则代码将抛出ArrayIndexOutOfBounsException
。我让你做必要的检查
编辑:
嗯,我使用的日历代码接受时区名称。我只是 需要一份完整的清单 如果是我,我会借此机会从过时的
Calendar
类切换到java.time。还有一个原因,正如我试图指出的,当你使用老式的时区类时,你随身携带着普通时区所需的一切,而你所需要的只是一个偏移量。如果您坚持使用日历
并为其提供时区
,转换就足够简单了。假设您使用的是ThreeTenABP(见下文):
格林尼治时间+01:00
这是你要的时区ID。其他的都是相似的,你可以自己构造它们。如果有疑问,请运行我的代码从那里获取它们。要输入到日历
中,您不需要ID,当然,您已经获得了时区
对象
还有一点更好(或者不是很糟糕),即使您需要一个老式的日历
作为遗留代码,您也不需要处理设计混乱的时区
类。您可以从以下代码获取您的日历
:
Calendar runDate = DateTimeUtils.toGregorianCalendar(
runDateTime.atZoneSameInstant(offset));
如果使用Java 8(我想也是通过desugaring使用Java 8),则转换会更短一些,分别是TimeZone.getTimeZone(offset)
和gregoriacalendar.from(runDateTime.atZoneSameInstant(offset))
问:java.time不需要Android API级别26吗?
time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
- 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
- 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
org.threeten.bp
导入日期和时间类
链接
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口
到Java6和Java7(JSR-310为三十)
- 我会使用现代日期时间API。但是,看起来您希望使用传统的日期-时间API来实现这一点。我想到的一个解决方案是建立一个映射到民用时区的军用时区地图,如上文所述。之后,您可以使用军用时区字母(例如,
A
,B
,C
等)显示该时区的日期时间
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Map<String, String> tzMap = new HashMap<>();
tzMap.put("A", "Europe/Paris");
tzMap.put("B", "Europe/Athens");
tzMap.put("C", "Europe/Moscow");
// and so on...
// Tests
Calendar calendar = Calendar.getInstance();
displayDateInMilitaryTZ(calendar, tzMap.get("A"));
displayDateInMilitaryTZ(calendar, tzMap.get("B"));
displayDateInMilitaryTZ(calendar, tzMap.get("C"));
}
static void displayDateInMilitaryTZ(Calendar runDate, String tz) {
TimeZone useThisTZ = TimeZone.getTimeZone(tz);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(useThisTZ);
System.out.println(sdf.format(runDate.getTime()));
}
}
遵循OLEV.V.指南,此java代码选择并选择正确的时区。 这段代码是说明性的,效率不高,但它可以工作
runDate = Calendar.getInstance();
// select timezone geographically by longitude
// degrees West = - longitude 0 to -180
// degrees East = + longitude 0 to +180
// the logic below proceeds eastward from Greenwich
if ((longitude > -7.5) && (longitude < 7.5)) //UTC+0
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+0"); tzName = "Zulu"; }
else if ((longitude > 7.5) && (longitude < 22.5)) //UTC+1
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-1"); tzName = "Alpha"; }
else if ((longitude > 22.5) && (longitude < 37.5)) //UTC+2
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-2"); tzName = "Bravo"; }
else if ((longitude > 37.5) && (longitude < 52.50)) //UTC+3
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-3"); tzName = "Charlie"; }
else if ((longitude > 52.5) && (longitude < 67.5)) //UTC+4
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-4"); tzName = "Delta"; }
else if ((longitude > 67.5) && (longitude < 82.5)) //UTC+5
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-5"); tzName = "Echo"; }
else if ((longitude > 82.5) && (longitude < 97.5)) //UTC+6
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-6"); tzName = "Foxtrot"; }
else if ((longitude > 97.5) && (longitude < 112.5)) //UTC+7
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-7"); tzName = "Golf"; }
else if ((longitude > 112.5) && (longitude < 127.5)) //UTC+8
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-8"); tzName = "Hotel"; }
else if ((longitude > 127.5) && (longitude < 142.5)) //UTC+9
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-9"); tzName = "India"; }
else if ((longitude > 142.5) && (longitude < 157.5)) //UTC+10
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-10"); tzName = "Kilo"; }
else if ((longitude > 157.5) && (longitude < 172.5)) //UTC+11
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-11"); tzName = "Lima"; }
else if ((longitude > 172.5) && (longitude < 180)) //UTC+12 7.5 degrees wide
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-12"); tzName = "Mike"; }
else if ((longitude > -180) && (longitude < -172.5)) //UTC-12 7.5 degrees wide
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+12"); tzName = "Yankee"; }
else if ((longitude > -172.5) && (longitude < -157.5)) //UTC-11
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+11"); tzName = "X-Ray"; }
else if ((longitude > -157.5) && (longitude < -142.5)) //UTC-10
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+10"); tzName = "Whiskey"; }
else if ((longitude > -142.5) && (longitude < -127.5)) //UTC-9
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+9"); tzName = "Victor"; }
else if ((longitude > -127.5) && (longitude < -112.5)) //UTC-8
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+8"); tzName = "Uniform"; }
else if ((longitude > -112.5) && (longitude < -97.5)) //UTC-7
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+7"); tzName = "Tango"; }
else if ((longitude > -97.5) && (longitude < -82.5)) //UTC-6
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+6"); tzName = "Sierra"; }
else if ((longitude > -82.5) && (longitude < -67.5)) //UTC-5
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+5"); tzName = "Romeo"; }
else if ((longitude > -67.5) && (longitude < -52.5)) //UTC-4
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+4"); tzName = "Quebec"; }
else if ((longitude > -52.5) && (longitude < -37.5)) //UTC-3
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+3"); tzName = "Papa"; }
else if ((longitude > -37.5) && (longitude < -22.5)) //UTC-2
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+2"); tzName = "Oscar"; }
else if ((longitude > -22.5) && (longitude < -7.5)) //UTC-1
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+1"); tzName = "November"; }
else
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+0"); tzName = "Error"; }
runDate.setTimeZone(useThisTZ);
runDate=Calendar.getInstance();
//按经度按地理位置选择时区
//西度=-经度0至-180
//东经=+经度0至+180度
//下面的逻辑从格林威治向东延伸
如果((经度>-7.5)和&(经度<7.5))//UTC+0
{useThisTZ=TimeZone.getTimeZone(“Etc/GMT+0”);tzName=“Zulu”}
否则如果((经度>7.5)和&(经度<22.5))//UTC+1
{useThisTZ=TimeZone.getTimeZone(“Etc/GMT-1”);tzName=“Alpha”}
否则如果((经度>22.5)和&(经度<37.5))//UTC+2
{useThisTZ=TimeZone.getTimeZone(“Etc/GMT-2”);tzName=“Bravo”}
否则如果((经度>37.5)和((经度<52.50))//UTC+3
{useThisTZ=TimeZone.getTimeZone(“Etc/GMT-3”);tzName=“Charlie”;}
否则如果((经度>52.5)和&(经度<67.5))//UTC+4
{useThisTZ=TimeZone.getTimeZone(“Etc/GMT-4”);tzName=“Delta”}
否则如果((经度>67.5)和&(经度<82.5))//UTC+5
{useThisTZ=TimeZone.getTimeZone(“Etc/GMT-5”);tzName=“Echo”}
否则如果((经度>82.5)和(&(经度<97.5))//UTC+6
{useThi
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
public class Main {
public static void main(String[] args) {
Map<String, String> tzMap = new HashMap<>();
tzMap.put("A", "Europe/Paris");
tzMap.put("B", "Europe/Athens");
tzMap.put("C", "Europe/Moscow");
// and so on...
// Tests
Calendar calendar = Calendar.getInstance();
displayDateInMilitaryTZ(calendar, tzMap.get("A"));
displayDateInMilitaryTZ(calendar, tzMap.get("B"));
displayDateInMilitaryTZ(calendar, tzMap.get("C"));
}
static void displayDateInMilitaryTZ(Calendar runDate, String tz) {
TimeZone useThisTZ = TimeZone.getTimeZone(tz);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(useThisTZ);
System.out.println(sdf.format(runDate.getTime()));
}
}
2020-09-23 23:33:16
2020-09-24 00:33:16
2020-09-24 00:33:16
runDate = Calendar.getInstance();
// select timezone geographically by longitude
// degrees West = - longitude 0 to -180
// degrees East = + longitude 0 to +180
// the logic below proceeds eastward from Greenwich
if ((longitude > -7.5) && (longitude < 7.5)) //UTC+0
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+0"); tzName = "Zulu"; }
else if ((longitude > 7.5) && (longitude < 22.5)) //UTC+1
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-1"); tzName = "Alpha"; }
else if ((longitude > 22.5) && (longitude < 37.5)) //UTC+2
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-2"); tzName = "Bravo"; }
else if ((longitude > 37.5) && (longitude < 52.50)) //UTC+3
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-3"); tzName = "Charlie"; }
else if ((longitude > 52.5) && (longitude < 67.5)) //UTC+4
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-4"); tzName = "Delta"; }
else if ((longitude > 67.5) && (longitude < 82.5)) //UTC+5
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-5"); tzName = "Echo"; }
else if ((longitude > 82.5) && (longitude < 97.5)) //UTC+6
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-6"); tzName = "Foxtrot"; }
else if ((longitude > 97.5) && (longitude < 112.5)) //UTC+7
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-7"); tzName = "Golf"; }
else if ((longitude > 112.5) && (longitude < 127.5)) //UTC+8
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-8"); tzName = "Hotel"; }
else if ((longitude > 127.5) && (longitude < 142.5)) //UTC+9
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-9"); tzName = "India"; }
else if ((longitude > 142.5) && (longitude < 157.5)) //UTC+10
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-10"); tzName = "Kilo"; }
else if ((longitude > 157.5) && (longitude < 172.5)) //UTC+11
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-11"); tzName = "Lima"; }
else if ((longitude > 172.5) && (longitude < 180)) //UTC+12 7.5 degrees wide
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT-12"); tzName = "Mike"; }
else if ((longitude > -180) && (longitude < -172.5)) //UTC-12 7.5 degrees wide
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+12"); tzName = "Yankee"; }
else if ((longitude > -172.5) && (longitude < -157.5)) //UTC-11
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+11"); tzName = "X-Ray"; }
else if ((longitude > -157.5) && (longitude < -142.5)) //UTC-10
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+10"); tzName = "Whiskey"; }
else if ((longitude > -142.5) && (longitude < -127.5)) //UTC-9
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+9"); tzName = "Victor"; }
else if ((longitude > -127.5) && (longitude < -112.5)) //UTC-8
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+8"); tzName = "Uniform"; }
else if ((longitude > -112.5) && (longitude < -97.5)) //UTC-7
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+7"); tzName = "Tango"; }
else if ((longitude > -97.5) && (longitude < -82.5)) //UTC-6
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+6"); tzName = "Sierra"; }
else if ((longitude > -82.5) && (longitude < -67.5)) //UTC-5
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+5"); tzName = "Romeo"; }
else if ((longitude > -67.5) && (longitude < -52.5)) //UTC-4
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+4"); tzName = "Quebec"; }
else if ((longitude > -52.5) && (longitude < -37.5)) //UTC-3
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+3"); tzName = "Papa"; }
else if ((longitude > -37.5) && (longitude < -22.5)) //UTC-2
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+2"); tzName = "Oscar"; }
else if ((longitude > -22.5) && (longitude < -7.5)) //UTC-1
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+1"); tzName = "November"; }
else
{ useThisTZ = TimeZone.getTimeZone("Etc/GMT+0"); tzName = "Error"; }
runDate.setTimeZone(useThisTZ);