1b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo/* 2b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * Copyright (C) 2014 The Android Open Source Project 3b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * 4b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * Licensed under the Apache License, Version 2.0 (the "License"); 5b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * you may not use this file except in compliance with the License. 6b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * You may obtain a copy of the License at 7b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * 8b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * http://www.apache.org/licenses/LICENSE-2.0 9b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * 10b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * Unless required by applicable law or agreed to in writing, software 11b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * distributed under the License is distributed on an "AS IS" BASIS, 12b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * See the License for the specific language governing permissions and 14b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * limitations under the License. 15b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo */ 16b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 17b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzopackage com.android.bluetooth.mapclient; 18b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 19b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.Calendar; 20b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.Date; 21b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.Locale; 22b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.TimeZone; 23b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.regex.Matcher; 24b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzoimport java.util.regex.Pattern; 25b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 26b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzopublic final class ObexTime { 27b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 28b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo private Date mDate; 29b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 30b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo public ObexTime(String time) { 31b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo /* 32b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * match OBEX time string: YYYYMMDDTHHMMSS with optional UTF offset 33b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * +/-hhmm 34b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo */ 35b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo Pattern p = Pattern 36b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo .compile( 37b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo "(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})(([+-])(\\d{2})(\\d{2})" 38b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo + ")?"); 39b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo Matcher m = p.matcher(time); 40b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 41b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo if (m.matches()) { 42b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 43b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo /* 44b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * matched groups are numberes as follows: YYYY MM DD T HH MM SS + 45b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * hh mm ^^^^ ^^ ^^ ^^ ^^ ^^ ^ ^^ ^^ 1 2 3 4 5 6 8 9 10 all groups 46b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * are guaranteed to be numeric so conversion will always succeed 47b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * (except group 8 which is either + or -) 48b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo */ 49b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 50b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo Calendar cal = Calendar.getInstance(); 51b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo cal.set(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)) - 1, 52b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo Integer.parseInt(m.group(3)), Integer.parseInt(m.group(4)), 53b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo Integer.parseInt(m.group(5)), Integer.parseInt(m.group(6))); 54b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 55b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo /* 56b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * if 7th group is matched then we have UTC offset information 57b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo * included 58b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo */ 59b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo if (m.group(7) != null) { 60b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo int ohh = Integer.parseInt(m.group(9)); 61b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo int omm = Integer.parseInt(m.group(10)); 62b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 63b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo /* time zone offset is specified in miliseconds */ 64b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo int offset = (ohh * 60 + omm) * 60 * 1000; 65b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 66b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo if (m.group(8).equals("-")) { 67b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo offset = -offset; 68b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 69b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 70b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo TimeZone tz = TimeZone.getTimeZone("UTC"); 71b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo tz.setRawOffset(offset); 72b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 73b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo cal.setTimeZone(tz); 74b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 75b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 76b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo mDate = cal.getTime(); 77b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 78b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 79b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 80b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo public ObexTime(Date date) { 81b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo mDate = date; 82b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 83b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 84b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo public Date getTime() { 85b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo return mDate; 86b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 87b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 88b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo @Override 89b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo public String toString() { 90b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo if (mDate == null) { 91b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo return null; 92b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 93b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 94b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo Calendar cal = Calendar.getInstance(); 95b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo cal.setTime(mDate); 96b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo 97b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo /* note that months are numbered stating from 0 */ 98b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo return String.format(Locale.US, "%04d%02d%02dT%02d%02d%02d", 99b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, 100b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY), 101b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND)); 102b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo } 103b68b83c0463161ce65922ec606f12244446efab1Joseph Pirozzo} 104