/*
* $Id$
*
* Copyright (C) 2003-2015 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.fs.iso9660;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import org.jnode.util.LittleEndian;
/**
* ISO9660 datetime structure.
*
* @author Daniel Noll
*/
public class ISO9660DTime {
/**
* Length of the structure.
*/
static final int LENGTH = 7;
/**
* Number of years since 1900.
*/
private final int/*uint8*/ year;
/**
* Month of the year from 1 to 12.
*/
private final int/*uint8*/ month;
/**
* Day of the month from 1 to 31.
*/
private final int/*uint8*/ day;
/**
* Hour of the day from 0 to 23.
*/
private final int/*uint8*/ hour;
/**
* Minute of the hour from 0 to 59.
*/
private final int/*uint8*/ minute;
/**
* Second of the minute from 0 to 59.
*/
private final int/*uint8*/ second;
/**
* GMT values -48 .. + 52 in 15 minute intervals (e.g. -48 = GMT-12, +48=GMT+12, 0=UTC.)
*/
private final int/*int8*/ gmtOffset;
/**
* Constructs an ISO9660 datetime structure by reading from the provided byte array.
*
* @param buff the byte array from which to read.
* @param off offset into the byte array at which to read the struct.
*/
public ISO9660DTime(byte[] buff, int off) {
year = LittleEndian.getUInt8(buff, off);
month = LittleEndian.getUInt8(buff, off + 1);
day = LittleEndian.getUInt8(buff, off + 2);
hour = LittleEndian.getUInt8(buff, off + 3);
minute = LittleEndian.getUInt8(buff, off + 4);
second = LittleEndian.getUInt8(buff, off + 5);
gmtOffset = LittleEndian.getInt8(buff, off + 6);
}
/**
* Converts to a Java date, milliseconds since 1970.
*
* @return the date as millis since 1970.
*/
public long toJavaMillis() {
// Force use of the Gregorian calendar in UTC and manually offset hours later.
// Mainly because it isn't convenient to create a TimeZone from a UTC/GMT offset.
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.clear(); // kills milliseconds or any other partial crap.
cal.set(year + 1900, month - 1, day, hour, minute, second);
// GMT offset in 15 minute intervals.
// Example, if offset is GMT+10, the value will be +40, and we need to subtract 600 minutes.
cal.add(Calendar.MINUTE, -gmtOffset * 15);
return cal.getTimeInMillis();
}
}