Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Android日历设置为航海或军事时区_Java_Android_Calendar_Timezone_Military - Fatal编程技术网

Java 如何将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); 我需要适应航海或军事时区。这些是地理上的,而不是民事上的。我需要确定可

在我的Android应用程序中,我在不同的时区使用日历。这样我可以调整应用程序的操作 因地制宜

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为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

    • 我会使用现代日期时间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);