luxon
Version: 
Immutable date wrapper
38 lines (34 loc) • 1.34 kB
JavaScript
/**
 * @private
 */
import Zone from '../zone';
import LocalZone from '../zones/localZone';
import IANAZone from '../zones/IANAZone';
import FixedOffsetZone from '../zones/fixedOffsetZone';
import InvalidZone from '../zones/invalidZone';
import { isUndefined, isString, isNumber } from './util';
export function normalizeZone(input, defaultZone) {
  let offset;
  if (isUndefined(input) || input === null) {
    return defaultZone;
  } else if (input instanceof Zone) {
    return input;
  } else if (isString(input)) {
    const lowered = input.toLowerCase();
    if (lowered === 'local') return LocalZone.instance;
    else if (lowered === 'utc' || lowered === 'gmt') return FixedOffsetZone.utcInstance;
    else if ((offset = IANAZone.parseGMTOffset(input)) != null) {
      // handle Etc/GMT-4, which V8 chokes on
      return FixedOffsetZone.instance(offset);
    } else if (IANAZone.isValidSpecifier(lowered)) return new IANAZone(input);
    else return FixedOffsetZone.parseSpecifier(lowered) || InvalidZone.instance;
  } else if (isNumber(input)) {
    return FixedOffsetZone.instance(input);
  } else if (typeof input === 'object' && input.offset) {
    // This is dumb, but the instanceof check above doesn't seem to really work
    // so we're duck checking it
    return input;
  } else {
    return InvalidZone.instance;
  }
}