1

生のオフセットを追加し、ローカル タイム ゾーンに従って変換するには、日付/時刻文字列を解析する必要があります。

サーバーから取得した日時の形式は、「05-25-2012 02:30 PM」です。

この形式は次の方法では解析されません: HttpDateParser.parse(time) メソッド

しかし、HttpDateParser はこの形式を解析します: "25-MAY-2012 02:30 PM"

長い値を取得するには、BB の "05-25-2012 02:30 PM" 文字列を解析する方法を教えてください。

もう 1 つ問題があります。タイム ゾーンを GMT、IST の形式で表示する必要がありますが、表示できるのは Asia/Calcutta、America/Los_Angeles などだけです。

4

1 に答える 1

4

BlackBerry Java には、開発者が Desktop Java や Android Java アプリケーションでさえも使用している便利な String 処理 API と Date フォーマット API がいくつかありません。そのため、自分で解析を行う必要があり、タイム ゾーンを処理する必要がある場合は面倒です。あなたのサーバーがどのタイムゾーンにあるかを言わなかったので、質問に表示された文字列にタイムゾーン情報が含まれていなくても、それを知っていると仮定する必要があります.

免責事項: このコードは、私のアプリから直接取得したものではないため、厳密なテストを経ていません。これは概念実証です。独自のタイム ゾーンをすべてテストする必要があり、おそらく、夏時間の切り替え時に機能することを確認する必要があります。 また、ここで使用する方法の制限については、blackberry API ドキュメントを参照してください。TimeZone.getOffset()

最初に私のインポート:

import java.util.Date;
import java.util.TimeZone;
import java.util.Hashtable;
import java.util.Calendar;

import net.rim.device.api.i18n.SimpleDateFormat;
import net.rim.device.api.io.http.HttpDateParser;
import net.rim.device.api.util.StringUtilities;

次に、サーバーから渡された文字列を解析するコード。この時間は、サーバーの現在のタイム ゾーン (夏時間調整済み) か、モバイル クライアントのタイム ゾーンではない他の既知のタイム ゾーンのいずれかであると想定しています。必要に応じて、既知のサーバー タイム ゾーンの値New_Yorkを変更します。

   private Date parseServerTime(String timeFromServer) {
      // separate the time string into tokens, which accepts ' ' or '-' or ':' as delimeters
      String tokens[] = StringUtilities.stringToKeywords(timeFromServer);
      int month = Integer.parseInt(tokens[0]);
      int day = Integer.parseInt(tokens[1]);
      int year = Integer.parseInt(tokens[2]);
      int hours = Integer.parseInt(tokens[3]);
      int minutes = Integer.parseInt(tokens[4]);
      boolean isPm = tokens[5].equalsIgnoreCase("PM");
      // convert hours to 24 hour time
      if (hours == 12 && !isPm) {
         hours = 0;
      } else if (hours != 12 && isPm) {
         hours += 12;
      }
      int millisToday = ((hours * 60) + minutes) * 60 * 1000;

      StringBuffer reformattedTime = new StringBuffer();
      // reorder the year, month and day to be able to use HttpDateParser (YYYY-MM-DDTHH:mm)
      reformattedTime.append(tokens[2]).append('-').append(tokens[0]).append('-').append(tokens[1]);
      reformattedTime.append('T').append(hours).append(':').append(minutes);
      long unadjustedTimeFromServer = HttpDateParser.parse(reformattedTime.toString());

      int monthIndex = month - 1;
      // This example assumes the server is giving us a time from the Eastern US time zone
      TimeZone serverZone = TimeZone.getTimeZone("America/New_York");
      int serverOffset = serverZone.getOffset(1, // 1 -> AD, not BC
            year, 
            monthIndex, 
            day, 
            1, // I'm not sure, but I don't think day-of-week matters here?
            millisToday);

      return new Date(unadjustedTimeFromServer - serverOffset);
   }

Date次に、デバイスのタイム ゾーンと、タイム ゾーン表示に必要な短いコードを使用して、クライアント用に解析されたものをフォーマットします。

   private String formatClientTime(Date dateFromServer) {
      TimeZone clientZone = TimeZone.getDefault();
      String tzKey = clientZone.toString();
      String[] tzDisplayNames = StringUtilities.stringToKeywords((String) _timeZones.get(tzKey));

      // we might have to use the "daylight" time zone short code
      Calendar cal = Calendar.getInstance(clientZone);
      cal.setTime(dateFromServer);
      int clientOffset = clientZone.getOffset(1, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
            cal.get(Calendar.DAY_OF_MONTH), cal.get(Calendar.DAY_OF_WEEK), cal.get(Calendar.MILLISECOND));
      int rawOffset = clientZone.getRawOffset();

      // if the daylight savings time adjusted offset isn't equal to the raw offset, we
      //   must be in daylight savings time
      boolean isTimeDuringDaylightSavings = (clientOffset != rawOffset);
      String tzCode = isTimeDuringDaylightSavings ? tzDisplayNames[1] : tzDisplayNames[0];

      // TODO: change this to whatever output format you want to use for the UI
      SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy hh:mm aa");
      return formatter.formatLocal(dateFromServer.getTime()) + " " + tzCode;
   }

そして、私はこのすべてのコードを次のように使用します:

  mapTimeZoneCodes(); 

  Date date = parseServerTime("05-25-2012 02:30 PM");
  String text = formatClientTime(date);

私のmapTimeZoneCodes()方法は、好きではない長い BlackBerry タイム ゾーン文字列 ("Asia/Calcutta") と短いコード ("IST") の間のマッピングを初期化する単なるユーティリティです。私の知る限り、BlackBerry は、人々が慣れ親しんでいるショート コードを表示するための API を提供していません。少なくとも OS 5.0 では、多くの開発者がまだサポートする必要があります。これを静的ユーティリティ クラスにリファクタリングすることもできます。デスクトップ Java に関するこの記事に基づいて、私が使用したマッピングを次に示します。

これをテストするために、タイムゾーン文字列のマッピングをいくつか入力するだけで済みました。これを使用する場合は、残りの部分、または少なくともアプリが必要とする部分を埋める必要があります。そうしないと、クラッシュする可能性があります。私が使用するテーブルでは、夏時間のために、タイム ゾーンごとに 2 つの (サブ) 文字列が必要であることに注意してください。気が向いたら、作業が終わったらソリューションを更新できます。しかし、私はあなたに任せます。

   private Hashtable _timeZones;

   private void mapTimeZoneCodes() {
      // TODO: you can uncomment this code and use it to generate your map of time zone ids and short codes
      //String[] ids = TimeZone.getAvailableIDs();
      //for (int i = 0; i < ids.length; i++) {
      //   System.out.println(" _timeZones.put(\"" + ids[i] + "\", \"\");");
      //}
      _timeZones = new Hashtable();
      _timeZones.put("Pacific/Kwajalein", "");
      _timeZones.put("Pacific/Midway", "");
      _timeZones.put("Pacific/Honolulu", "");
      _timeZones.put("America/Anchorage", "");
      _timeZones.put("America/Tijuana", "");
      _timeZones.put("America/Los_Angeles", "PST PDT");
      _timeZones.put("America/Phoenix", "");
      _timeZones.put("America/Denver", "MST MDT");
      _timeZones.put("America/Tegucigalpa", "");
      _timeZones.put("America/Tegucigalpa_2", "");
      _timeZones.put("America/El_Salvador", "");
      _timeZones.put("America/Regina", "");
      _timeZones.put("America/Chicago", "CST CDT");
      _timeZones.put("America/Mexico_City", "");
      _timeZones.put("America/Mexico_City_2", "");
      _timeZones.put("America/Bogota", "");
      _timeZones.put("America/Indianapolis", "");
      _timeZones.put("America/New_York", "EST EDT");
      _timeZones.put("America/Caracas", "");
      _timeZones.put("America/La_Paz", "");
      _timeZones.put("America/Manaus", "");
      _timeZones.put("America/Santiago", "");
      _timeZones.put("America/Halifax", "");
      _timeZones.put("America/St_Johns", "");
      _timeZones.put("America/Montevideo", "");
      _timeZones.put("America/Guyana", "");
      _timeZones.put("America/Buenos_Aires", "");
      _timeZones.put("America/Sao_Paulo", "");
      _timeZones.put("America/Godthab", "");
      _timeZones.put("America/South_Georgia", "");
      _timeZones.put("Atlantic/Cape_Verde", "");
      _timeZones.put("Atlantic/Azores", "");
      _timeZones.put("GMT", "GMT");
      _timeZones.put("Europe/Dublin", "");
      _timeZones.put("Africa/Luanda", "");
      _timeZones.put("Europe/Amsterdam", "");
      _timeZones.put("Europe/Belgrade", "");
      _timeZones.put("Europe/Brussels", "");
      _timeZones.put("Europe/Belgrade Yugoslavia(YU)", "");
      _timeZones.put("Africa/Windhoek", "");
      _timeZones.put("Asia/Amman", "");
      _timeZones.put("Africa/Harare", "");
      _timeZones.put("Asia/Jerusalem", "");
      _timeZones.put("Europe/Minsk", "");
      _timeZones.put("Africa/Cairo", "");
      _timeZones.put("Asia/Beirut", "");
      _timeZones.put("Europe/Athens", "");
      _timeZones.put("Europe/Helsinki", "");
      _timeZones.put("Asia/Kuwait", "");
      _timeZones.put("Africa/Nairobi", "");
      _timeZones.put("Asia/Baghdad", "");
      _timeZones.put("Europe/Moscow", "");
      _timeZones.put("Asia/Tehran", "");
      _timeZones.put("Asia/Tbilisi", "");
      _timeZones.put("Asia/Muscat", "");
      _timeZones.put("Asia/Baku", "");
      _timeZones.put("Asia/Yerevan", "");
      _timeZones.put("Asia/Caucasus", "");
      _timeZones.put("Asia/Kabul", "");
      _timeZones.put("Asia/Karachi", "");
      _timeZones.put("Asia/Tashkent", "");
      _timeZones.put("Asia/Yekaterinburg", "");
      _timeZones.put("Asia/Calcutta", "");
      _timeZones.put("Asia/Colombo", "");
      _timeZones.put("Asia/Katmandu", "");
      _timeZones.put("Asia/Dhaka", "");
      _timeZones.put("Asia/Almaty", "");
      _timeZones.put("Asia/Rangoon", "");
      _timeZones.put("Asia/Bangkok", "");
      _timeZones.put("Asia/Krasnoyarsk", "");
      _timeZones.put("Asia/Hong_Kong", "");
      _timeZones.put("Asia/Kuala_Lumpur", "");
      _timeZones.put("Australia/Perth", "");
      _timeZones.put("Asia/Taipei", "");
      _timeZones.put("Asia/Irkutsk", "");
      _timeZones.put("Asia/Tokyo", "");
      _timeZones.put("Asia/Seoul", "");
      _timeZones.put("Asia/Yakutsk", "");
      _timeZones.put("Australia/Darwin", "");
      _timeZones.put("Australia/Adelaide", "");
      _timeZones.put("Pacific/Guam", "");
      _timeZones.put("Asia/Vladivostok", "");
      _timeZones.put("Australia/Hobart", "");
      _timeZones.put("Australia/Brisbane", "");
      _timeZones.put("Australia/Sydney", "");
      _timeZones.put("Asia/Magadan", "");
      _timeZones.put("Pacific/Fiji", "");
      _timeZones.put("Pacific/Auckland", "");
      _timeZones.put("Pacific/Tongatapu", "");
   }
于 2012-05-26T07:40:29.370 に答える