# Class TimeMapper

java.lang.Object
uk.ac.starlink.table.TimeMapper

All Implemented Interfaces:
  `DomainMapper`

public abstract class TimeMapper extends Object implements DomainMapper
DomainMapper for mapping values to epochs in a common time scale.

Since:
  12 Aug 2013
Author:
  Mark Taylor

## Field Summary

Fields
Modifier and Type
Field
Description
`static final TimeMapper`
`DECIMAL_YEAR`
Mapper for numeric values in decimal year (since 0 AD).
`static final TimeMapper`
`ISO_8601`
Mapper for ISO-8601 strings.
`static final TimeMapper`
`JD`
Mapper for numeric values in Julian Day.
`static final TimeMapper`
`MJD`
Mapper for numeric values in Modified Julian Date.
`static final TimeMapper`
`UNIX_SECONDS`
Mapper for numeric values (already) in unix seconds.

## Constructor Summary

Constructors
Modifier
Constructor
Description
`protected`
`TimeMapper(Class<?> sourceClass, String sourceName, String sourceDescription)`
Constructor.

## Method Summary

Modifier and Type
Method
Description
`Class<?>`
`getSourceClass()`
Returns the type of values from which this mapper instance can convert.
`String`
`getSourceDescription()`
Returns a description of the type of source values which this mapper can convert from.
`String`
`getSourceName()`
Returns a short name for the type of source values which this mapper can convert from.
`TimeDomain`
`getTargetDomain()`
Returns `TimeDomain.INSTANCE`.
`static TimeMapper[]`
`getTimeMappers()`
Returns a selection of time mapper instances.
`abstract double`
`toUnixSeconds(Object sourceValue)`
Maps a source value to time in seconds since the Unix epoch (1970-01-01T00:00:00).

### Methods inherited from class Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### DECIMAL_YEAR

public static final TimeMapper DECIMAL_YEAR
Mapper for numeric values in decimal year (since 0 AD).

### MJD

public static final TimeMapper MJD
Mapper for numeric values in Modified Julian Date.

### JD

public static final TimeMapper JD
Mapper for numeric values in Julian Day.

### UNIX_SECONDS

public static final TimeMapper UNIX_SECONDS
Mapper for numeric values (already) in unix seconds.

### ISO_8601

public static final TimeMapper ISO_8601
Mapper for ISO-8601 strings.

## Constructor Details

### TimeMapper

protected TimeMapper(Class<?> sourceClass, String sourceName, String sourceDescription)
Constructor.

Parameters:
  `sourceClass` - source class
  `sourceName` - source type name
  `sourceDescription` - source type description

## Method Details

### getTargetDomain

public TimeDomain getTargetDomain()
Returns `TimeDomain.INSTANCE`.

Specified by:
  `getTargetDomain` in interface `DomainMapper`
Returns:
  domain identifier

### getSourceClass

public Class<?> getSourceClass()
Description copied from interface: `DomainMapper`
Returns the type of values from which this mapper instance can convert. This should be as specific as possible to cover all the possible options, but in some cases that may mean it has simply to return `Object.class`.

Specified by:
  `getSourceClass` in interface `DomainMapper`
Returns:
  class of mappable source objects to which this mapper can be applied

### getSourceName

public String getSourceName()
Description copied from interface: `DomainMapper`
Returns a short name for the type of source values which this mapper can convert from.

Specified by:
  `getSourceName` in interface `DomainMapper`
Returns:
  mapper source type name

### getSourceDescription

public String getSourceDescription()
Description copied from interface: `DomainMapper`
Returns a description of the type of source values which this mapper can convert from.

Specified by:
  `getSourceDescription` in interface `DomainMapper`
Returns:
  mapper source type description

### toUnixSeconds

public abstract double toUnixSeconds(Object sourceValue)
Maps a source value to time in seconds since the Unix epoch (1970-01-01T00:00:00). The time scale is generally assumed to be UTC, though conversions may not always be performed, for instance for values in which the intended time scale is not obvious.

A java (IEEE 754) double has 52+1 bits of precision, which I make 52*ln(2)/ln(10)=15.65 decimal places, and a year contains 3.15e7 seconds, which gives you the following precisions:

- epoch +/- 1.7 months: 1 nanosecond precision
- epoch +/- 140 years: 1 microsecond precision
- epoch +/- 140 kyears: 1 millisecond precision
- epoch +/- 140 Myears: 1 second precision

That means around microsecond precision for values near the current epoch (unless this software proves more long lasting than I anticipate). It should be OK for most purposes.

Parameters:
  `sourceValue` - value in source domain
Returns:
  number of seconds since midnight 1 Jan 1970

### getTimeMappers

public static TimeMapper[] getTimeMappers()
Returns a selection of time mapper instances.