Last active
March 24, 2016 11:34
-
-
Save Jeevuz/1691d9b79b323f848a9d to your computer and use it in GitHub Desktop.
java.sql.Timestamp subclass with ability to parse and hold the raw server string with microseconds and optional format parts. Has usefull method daysFromToday()
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example; | |
import android.support.annotation.NonNull; | |
import android.text.TextUtils; | |
import java.text.DateFormat; | |
import java.text.ParseException; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
import java.util.Locale; | |
import java.util.TimeZone; | |
import java.util.concurrent.TimeUnit; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
/** | |
* Extends the {@link java.sql.Timestamp} to parse server datetime. | |
* Additionally stores the raw datetime input. | |
* @author Vasili Chyrvon ([email protected]) | |
*/ | |
public class Timestamp extends java.sql.Timestamp { | |
// The regex pattern of 2016-03-11T05:10:12.000001-03:50 with groups. Microseconds and timezone is optional. | |
private static final Pattern SERVER_DATE_PATTERN = Pattern.compile("([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2})\\.?([0-9]{6})?([+|-][0-9|\\:]{5})?"); | |
private static final String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"; | |
private static final String DEFAULT_TIMEZONE = "+00:00"; | |
public static final String NANO_NULLS_SUFFIX = "000"; | |
private String mRaw; // Server date | |
public String getRaw() { | |
return mRaw; | |
} | |
void setRaw(String raw) { | |
mRaw = raw; | |
} | |
@SuppressWarnings("deprecation") | |
public static Timestamp create(@NonNull String raw) { | |
String dateTime; | |
String microseconds; | |
String timeZone; | |
// Parse | |
Matcher matcher = SERVER_DATE_PATTERN.matcher(raw.trim()); | |
if (matcher.find()) { | |
dateTime = matcher.group(1); | |
microseconds = matcher.group(2); | |
timeZone = matcher.group(3); | |
} else { | |
throw new IllegalArgumentException("Server datetime (" + raw + ") not in the correct format!"); | |
} | |
timeZone = (!TextUtils.isEmpty(timeZone)) ? timeZone : DEFAULT_TIMEZONE; | |
// Get date | |
String dateTimeAndTimeZone = dateTime + timeZone; | |
DateFormat dateFormat = new SimpleDateFormat(DATETIME_FORMAT, Locale.US); | |
Date date; | |
try { | |
date = dateFormat.parse(dateTimeAndTimeZone); | |
} catch (ParseException e) { | |
throw new RuntimeException("Can't parse '" + dateTimeAndTimeZone + "'!"); | |
} | |
// Create and return timestamp | |
Timestamp timestamp = new Timestamp(date.getTime()); | |
if (!TextUtils.isEmpty(microseconds)) { | |
timestamp.setNanos(Integer.parseInt(microseconds + NANO_NULLS_SUFFIX)); | |
} | |
timestamp.setRaw(raw); // Save raw | |
return timestamp; | |
} | |
/** | |
* @deprecated Use {@link #create(String)} method instead | |
*/ | |
@Deprecated | |
public Timestamp(long theTime) { | |
super(theTime); | |
} | |
public int daysFromToday() { | |
long theDayMillis = getTime(); | |
theDayMillis = theDayMillis + TimeZone.getDefault().getOffset(theDayMillis); | |
long todayMillis = System.currentTimeMillis(); | |
todayMillis = todayMillis + TimeZone.getDefault().getOffset(todayMillis); | |
long theDay = TimeUnit.MILLISECONDS.toDays(theDayMillis); | |
long today = TimeUnit.MILLISECONDS.toDays(todayMillis); | |
int difference = (int) (theDay - today); | |
// Timber.d("daysFromToday(): theDay = %s,today = %s, difference => %s", theDay, today, difference); | |
return difference; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment