1192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta/* 2192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Copyright (C) 2014 The Android Open Source Project 3192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 4192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 5192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * you may not use this file except in compliance with the License. 6192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * You may obtain a copy of the License at 7192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 8192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 9192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 10192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Unless required by applicable law or agreed to in writing, software 11192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 12192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * See the License for the specific language governing permissions and 14192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * limitations under the License. 15192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 16192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 17192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapackage android.bluetooth.client.map.utils; 18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Calendar; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Date; 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Locale; 22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.TimeZone; 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.regex.Matcher; 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.regex.Pattern; 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapublic final class ObexTime { 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private Date mDate; 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public ObexTime(String time) { 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * match OBEX time string: YYYYMMDDTHHMMSS with optional UTF offset 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * +/-hhmm 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Pattern p = Pattern 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta .compile("(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})(([+-])(\\d{2})(\\d{2}))?"); 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Matcher m = p.matcher(time); 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (m.matches()) { 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * matched groups are numberes as follows: YYYY MM DD T HH MM SS + 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * hh mm ^^^^ ^^ ^^ ^^ ^^ ^^ ^ ^^ ^^ 1 2 3 4 5 6 8 9 10 all groups 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * are guaranteed to be numeric so conversion will always succeed 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * (except group 8 which is either + or -) 46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Calendar cal = Calendar.getInstance(); 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta cal.set(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)) - 1, 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Integer.parseInt(m.group(3)), Integer.parseInt(m.group(4)), 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Integer.parseInt(m.group(5)), Integer.parseInt(m.group(6))); 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * if 7th group is matched then we have UTC offset information 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * included 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (m.group(7) != null) { 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int ohh = Integer.parseInt(m.group(9)); 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int omm = Integer.parseInt(m.group(10)); 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* time zone offset is specified in miliseconds */ 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int offset = (ohh * 60 + omm) * 60 * 1000; 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (m.group(8).equals("-")) { 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta offset = -offset; 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta TimeZone tz = TimeZone.getTimeZone("UTC"); 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta tz.setRawOffset(offset); 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta cal.setTimeZone(tz); 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mDate = cal.getTime(); 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public ObexTime(Date date) { 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mDate = date; 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public Date getTime() { 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mDate; 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public String toString() { 88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mDate == null) { 89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return null; 90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Calendar cal = Calendar.getInstance(); 93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta cal.setTime(mDate); 94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* note that months are numbered stating from 0 */ 96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return String.format(Locale.US, "%04d%02d%02dT%02d%02d%02d", 97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, 98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), 99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND)); 100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 102