/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.ad.io; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import org.ldaptive.io.AbstractStringValueTranscoder; /** * Decodes and encodes an active directory file time value for use in an ldap attribute value. * * @author Middleware Services */ public class FileTimeValueTranscoder extends AbstractStringValueTranscoder<ZonedDateTime> { /** Number of milliseconds between standard Unix era (1/1/1970) and filetime start (1/1/1601). */ private static final long ERA_OFFSET = 11644473600000L; /** File time uses 100-nanosecond intervals. For conversion purposes this is 1x10^6 / 100. */ private static final long ONE_HUNDRED_NANOSECOND_INTERVAL = 10000L; @Override public ZonedDateTime decodeStringValue(final String value) { final Instant i = Instant.ofEpochMilli(Long.parseLong(value) / ONE_HUNDRED_NANOSECOND_INTERVAL - ERA_OFFSET); return ZonedDateTime.ofInstant(i, ZoneId.of("Z")); } @Override public String encodeStringValue(final ZonedDateTime value) { return String.valueOf((value.toInstant().toEpochMilli() + ERA_OFFSET) * ONE_HUNDRED_NANOSECOND_INTERVAL); } @Override public Class<ZonedDateTime> getType() { return ZonedDateTime.class; } }