Commit e89782c2 authored by Hilko Bengen's avatar Hilko Bengen

Merge tag 'upstream/20180704'

Upstream version 20180704
parents d86c6423 af4cf038
......@@ -18,6 +18,9 @@
# Code review files
/.review
# Pycharm files
/.idea
# Test coverage files
.coverage
tests-coverage.txt
language: python
virtualenv:
system_site_packages: true
matrix:
include:
- env: TARGET="pylint"
......@@ -35,11 +37,9 @@ matrix:
os: osx
osx_image: xcode9.2
language: generic
allow_failures:
- env: TARGET="linux-python34"
install:
- ./config/travis/install.sh
script:
- ./config/travis/runtests.sh
- ./config/travis/run_with_timeout.sh 30 ./config/travis/runtests.sh
after_success:
- if test ${TARGET} = "linux-python27"; then curl -o codecov.sh -s https://codecov.io/bash && /bin/bash ./codecov.sh; fi
......@@ -11,7 +11,14 @@ install:
- cmd: "%PYTHON%\\Scripts\\pip.exe install pywin32 WMI"
- cmd: "%PYTHON%\\python.exe %PYTHON%\\Scripts\\pywin32_postinstall.py -install"
- cmd: git clone https://github.com/log2timeline/l2tdevtools.git ..\l2tdevtools
- cmd: mkdir dependencies && set PYTHONPATH=..\l2tdevtools && "%PYTHON%\\python.exe" ..\l2tdevtools\tools\update.py --download-directory dependencies --machine-type x86 --msi-targetdir "%PYTHON%" --track dev funcsigs mock pbr six
- cmd: if [%TARGET%]==[python27] (
mkdir dependencies &&
set PYTHONPATH=..\l2tdevtools &&
"%PYTHON%\\python.exe" ..\l2tdevtools\tools\update.py --download-directory dependencies --machine-type x86 --msi-targetdir "%PYTHON%" --track dev funcsigs mock pbr six )
- cmd: if [%TARGET%]==[python36] (
mkdir dependencies &&
set PYTHONPATH=..\l2tdevtools &&
"%PYTHON%\\python.exe" ..\l2tdevtools\tools\update.py --download-directory dependencies --machine-type x86 --msi-targetdir "%PYTHON%" --track dev funcsigs mock pbr six )
build: off
......
dfdatetime (20180324-1) unstable; urgency=low
dfdatetime (20180704-1) unstable; urgency=low
* Auto-generated
-- Log2Timeline <log2timeline-dev@googlegroups.com> Sat, 24 Mar 2018 14:06:11 +0100
\ No newline at end of file
-- Log2Timeline <log2timeline-dev@googlegroups.com> Wed, 04 Jul 2018 20:18:28 +0200
\ No newline at end of file
#!/bin/bash
#
# Script to run commands on a Travis-CI test VM that otherwise would time out
# after 10 minutes. This replaces travis_wait and outputs stdout of the command
# running.
#
# This file is generated by l2tdevtools update-dependencies.py, any dependency
# related changes should be made in dependencies.ini.
# Exit on error.
set -e
# Usage: ./run_with_timeout.sh [TIMEOUT] [COMMAND] [OPTION] [...]
TIMEOUT=$1;
shift
# Launch a command in the background.
$* &
PID_COMMAND=$!;
# Probe the command every minute.
MINUTES=0;
while kill -0 ${PID_COMMAND} >/dev/null 2>&1;
do
# Print to stdout, seeing this prints a space and a backspace
# there is no visible trace.
echo -n -e " \b";
if test ${MINUTES} -ge ${TIMEOUT};
then
kill -9 ${PID_COMMAND} >/dev/null 2>&1;
echo -e "\033[0;31m[ERROR] command: $* timed out after: ${MINUTES} minute(s).\033[0m";
exit 1;
fi
MINUTES=$(( ${MINUTES} + 1 ));
sleep 60;
done
......@@ -12,7 +12,7 @@ if test "${TARGET}" = "pylint";
then
pylint --version
for FILE in `find setup.py dfdatetime tests -name \*.py`;
for FILE in `find setup.py config dfdatetime tests -name \*.py`;
do
echo "Checking: ${FILE}";
......
......@@ -5,4 +5,4 @@ dfDateTime, or Digital Forensics date and time, provides date and time
objects to preserve accuracy and precision.
"""
__version__ = '20180324'
__version__ = '20180704'
......@@ -107,11 +107,11 @@ class CocoaTime(interface.DateTimeValues):
"""Copies the Cocoa timestamp to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.######
str: date and time value formatted as: YYYY-MM-DD hh:mm:ss.###### or
None if the timestamp cannot be copied to a date and time string.
"""
if self._timestamp is None:
return
return None
number_of_days, hours, minutes, seconds = self._GetTimeValues(
int(self._timestamp))
......@@ -124,20 +124,3 @@ class CocoaTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:06d}'.format(
year, month, day_of_month, hours, minutes, seconds, microseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self.timestamp is None:
return None, None, None
try:
number_of_days, _, _, _ = self._GetTimeValues(int(self.timestamp))
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -114,11 +114,11 @@ class DelphiDateTime(interface.DateTimeValues):
"""Copies the Delphi TDateTime timestamp to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.######
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss.######" or
None if the timestamp is missing.
"""
if self._timestamp is None:
return
return None
number_of_seconds = self._timestamp * definitions.SECONDS_PER_DAY
......@@ -133,21 +133,3 @@ class DelphiDateTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:06d}'.format(
year, month, day_of_month, hours, minutes, seconds, microseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self.timestamp is None:
return None, None, None
try:
number_of_seconds = self.timestamp * definitions.SECONDS_PER_DAY
number_of_days, _, _, _ = self._GetTimeValues(int(number_of_seconds))
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -84,12 +84,12 @@ class FakeTime(interface.DateTimeValues):
"""Copies the fake timestamp to a date and time string.
Returns:
str: date and time value formatted as one of the following:
YYYY-MM-DD hh:mm:ss
YYYY-MM-DD hh:mm:ss.######
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss" or
"YYYY-MM-DD hh:mm:ss.######" or None if the number of seconds
is missing.
"""
if self._number_of_seconds is None:
return
return None
number_of_days, hours, minutes, seconds = self._GetTimeValues(
self._number_of_seconds)
......@@ -104,20 +104,3 @@ class FakeTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:06d}'.format(
year, month, day_of_month, hours, minutes, seconds,
self._microseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self._number_of_seconds is None:
return None, None, None
try:
number_of_days, _, _, _ = self._GetTimeValues(self._number_of_seconds)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -158,11 +158,11 @@ class FATDateTime(interface.DateTimeValues):
"""Copies the FAT date time to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss" or None
if number of seconds is missing.
"""
if self._number_of_seconds is None:
return
return None
number_of_days, hours, minutes, seconds = self._GetTimeValues(
self._number_of_seconds)
......@@ -172,20 +172,3 @@ class FATDateTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'.format(
year, month, day_of_month, hours, minutes, seconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self._number_of_seconds is None:
return None, None, None
try:
number_of_days, _, _, _ = self._GetTimeValues(self._number_of_seconds)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -110,12 +110,12 @@ class Filetime(interface.DateTimeValues):
"""Copies the FILETIME timestamp to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.#######
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss.#######" or
None if the timestamp is missing or invalid.
"""
if (self._timestamp is None or self._timestamp < 0 or
self._timestamp > self._UINT64_MAX):
return
return None
timestamp, remainder = divmod(self._timestamp, self._100NS_PER_SECOND)
number_of_days, hours, minutes, seconds = self._GetTimeValues(timestamp)
......@@ -125,22 +125,3 @@ class Filetime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:07d}'.format(
year, month, day_of_month, hours, minutes, seconds, remainder)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if (self.timestamp is None or self.timestamp < 0 or
self.timestamp > self._UINT64_MAX):
return None, None, None
try:
timestamp, _ = divmod(self.timestamp, self._100NS_PER_SECOND)
number_of_days, _, _, _ = self._GetTimeValues(timestamp)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -102,12 +102,12 @@ class HFSTime(interface.DateTimeValues):
"""Copies the HFS timestamp to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss" or None
if the timestamp is missing or invalid.
"""
if (self._timestamp is None or self._timestamp < 0 or
self._timestamp > self._UINT32_MAX):
return
return None
number_of_days, hours, minutes, seconds = self._GetTimeValues(
self._timestamp)
......@@ -117,21 +117,3 @@ class HFSTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'.format(
year, month, day_of_month, hours, minutes, seconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if (self.timestamp is None or self.timestamp < 0 or
self.timestamp > self._UINT32_MAX):
return None, None, None
try:
number_of_days, _, _, _ = self._GetTimeValues(self.timestamp)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -5,6 +5,7 @@ from __future__ import unicode_literals
import abc
import calendar
import decimal
from dfdatetime import decorators
from dfdatetime import definitions
......@@ -32,6 +33,14 @@ class DateTimeEpoch(object):
self.year = year
class NormalizedTimeEpoch(DateTimeEpoch):
"""dfDateTime normalized time epoch."""
def __init__(self):
"""Initializes a dfDateTime normalized time epoch."""
super(NormalizedTimeEpoch, self).__init__(1970, 1, 1)
class DateTimeValues(object):
"""Date and time values interface.
......@@ -43,6 +52,8 @@ class DateTimeValues(object):
_DAYS_PER_MONTH = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
_EPOCH_NORMALIZED_TIME = NormalizedTimeEpoch()
_100NS_PER_SECOND = 10000000
_100NS_PER_DECISECOND = 1000000
_100NS_PER_MILLISECOND = 10000
......@@ -77,12 +88,9 @@ class DateTimeValues(object):
Returns:
bool: True if the date time values are equal to other.
Raises:
ValueError: if other is not an instance of DateTimeValues.
"""
if not isinstance(other, DateTimeValues):
raise ValueError('Other not an instance of DateTimeValues')
return False
normalized_timestamp = self._GetNormalizedTimestamp()
other_normalized_timestamp = other._GetNormalizedTimestamp() # pylint: disable=protected-access
......@@ -207,12 +215,9 @@ class DateTimeValues(object):
Returns:
bool: True if the date time values are not equal to other.
Raises:
ValueError: if other is not an instance of DateTimeValues.
"""
if not isinstance(other, DateTimeValues):
raise ValueError('Other not an instance of DateTimeValues')
return True
normalized_timestamp = self._GetNormalizedTimestamp()
other_normalized_timestamp = other._GetNormalizedTimestamp() # pylint: disable=protected-access
......@@ -515,14 +520,17 @@ class DateTimeValues(object):
of bounds.
"""
if epoch_year < 0:
raise ValueError('Epoch year value out of bounds.')
raise ValueError('Epoch year value: {0:d} out of bounds.'.format(
epoch_year))
if epoch_month not in range(1, 13):
raise ValueError('Epoch month value out of bounds.')
raise ValueError('Epoch month value: {0:d} out of bounds.'.format(
epoch_month))
epoch_days_per_month = self._GetDaysPerMonth(epoch_year, epoch_month)
if epoch_day_of_month < 1 or epoch_day_of_month > epoch_days_per_month:
raise ValueError('Epoch day of month value out of bounds.')
raise ValueError('Epoch day of month value: {0:d} out of bounds.'.format(
epoch_day_of_month))
before_epoch = number_of_days < 0
......@@ -776,11 +784,12 @@ class DateTimeValues(object):
"""Determines time values.
Args:
number_of_seconds (int): number of seconds.
number_of_seconds (int|decimal.Decimal): number of seconds.
Returns:
tuple[int, int, int, int]: days, hours, minutes, seconds.
"""
number_of_seconds = int(number_of_seconds)
number_of_minutes, seconds = divmod(number_of_seconds, 60)
number_of_hours, minutes = divmod(number_of_minutes, 60)
number_of_days, hours = divmod(number_of_hours, 24)
......@@ -833,6 +842,18 @@ class DateTimeValues(object):
ValueError: if the time string is invalid or not supported.
"""
def CopyToPosixTimestamp(self):
"""Copies the date time value to a POSIX timestamp.
Returns:
int: a POSIX timestamp in seconds or None if no timestamp is available.
"""
normalized_timestamp = self._GetNormalizedTimestamp()
if normalized_timestamp is None:
return None
return int(normalized_timestamp)
# TODO: remove this method when there is no more need for it in dfvfs.
def CopyToStatTimeTuple(self):
"""Copies the date time value to a stat timestamp tuple.
......@@ -862,11 +883,23 @@ class DateTimeValues(object):
"""Copies the date time value to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.######
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss.######" or
None if the timestamp cannot be copied to a date and time string.
"""
@abc.abstractmethod
def CopyToDateTimeStringISO8601(self):
"""Copies the date time value to an ISO 8601 date and time string.
Returns:
str: date and time value formatted as an ISO 8601 date and time string or
None if the timestamp cannot be copied to a date and time string.
"""
date_time_string = self.CopyToDateTimeString()
if date_time_string:
date_time_string = date_time_string.replace(' ', 'T')
date_time_string = '{0:s}Z'.format(date_time_string)
return date_time_string
def GetDate(self):
"""Retrieves the date represented by the date and time values.
......@@ -874,6 +907,18 @@ class DateTimeValues(object):
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
normalized_timestamp = self._GetNormalizedTimestamp()
if normalized_timestamp is None:
return None, None, None
number_of_days, _, _, _ = self._GetTimeValues(normalized_timestamp)
try:
return self._GetDateValuesWithEpoch(
number_of_days, self._EPOCH_NORMALIZED_TIME)
except ValueError:
return None, None, None
# TODO: remove this method when there is no more need for it in plaso.
def GetPlasoTimestamp(self):
......@@ -888,4 +933,20 @@ class DateTimeValues(object):
return None
normalized_timestamp *= definitions.MICROSECONDS_PER_SECOND
return int(round(normalized_timestamp))
normalized_timestamp = normalized_timestamp.quantize(
1, rounding=decimal.ROUND_HALF_UP)
return int(normalized_timestamp)
def GetTimeOfDay(self):
"""Retrieves the time of day represented by the date and time values.
Returns:
tuple[int, int, int]: hours, minutes, seconds or (None, None, None)
if the date and time values do not represent a time of day.
"""
normalized_timestamp = self._GetNormalizedTimestamp()
if normalized_timestamp is None:
return None, None, None
_, hours, minutes, seconds = self._GetTimeValues(normalized_timestamp)
return hours, minutes, seconds
......@@ -98,12 +98,12 @@ class JavaTime(interface.DateTimeValues):
"""Copies the Java timestamp to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.###
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss.###" or
None if the timestamp is missing or invalid.
"""
if (self._timestamp is None or self._timestamp < self._INT64_MIN or
self._timestamp > self._INT64_MAX):
return
return None
timestamp, milliseconds = divmod(
self._timestamp, definitions.MILLISECONDS_PER_SECOND)
......@@ -114,22 +114,3 @@ class JavaTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:03d}'.format(
year, month, day_of_month, hours, minutes, seconds, milliseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if (self.timestamp is None or self.timestamp < self._INT64_MIN or
self.timestamp > self._INT64_MAX):
return None, None, None
try:
timestamp, _ = divmod(self.timestamp, definitions.MILLISECONDS_PER_SECOND)
number_of_days, _, _, _ = self._GetTimeValues(timestamp)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -112,11 +112,11 @@ class OLEAutomationDate(interface.DateTimeValues):
"""Copies the OLE Automation date to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.######
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss.######" or
None if the timestamp is missing.
"""
if self._timestamp is None:
return
return None
timestamp = self._timestamp * definitions.SECONDS_PER_DAY
......@@ -130,21 +130,3 @@ class OLEAutomationDate(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:06d}'.format(
year, month, day_of_month, hours, minutes, seconds, microseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self.timestamp is None:
return None, None, None
try:
timestamp = self.timestamp * definitions.SECONDS_PER_DAY
number_of_days, _, _, _ = self._GetTimeValues(int(timestamp))
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -108,23 +108,6 @@ class PosixTime(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}'.format(
year, month, day_of_month, hours, minutes, seconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self.timestamp is None:
return None, None, None
try:
number_of_days, _, _, _ = self._GetTimeValues(self.timestamp)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
class PosixTimeInMicroseconds(interface.DateTimeValues):
"""POSIX timestamp in microseconds.
......@@ -218,21 +201,3 @@ class PosixTimeInMicroseconds(interface.DateTimeValues):
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:06d}'.format(
year, month, day_of_month, hours, minutes, seconds, microseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self.timestamp is None:
return None, None, None
try:
timestamp, _ = divmod(self.timestamp, definitions.MICROSECONDS_PER_SECOND)
number_of_days, _, _, _ = self._GetTimeValues(timestamp)
return self._GetDateValuesWithEpoch(number_of_days, self._EPOCH)
except ValueError:
return None, None, None
......@@ -24,7 +24,7 @@ class RFC2579DateTime(interface.DateTimeValues):
uint8_t deciseconds,
char direction_from_utc,
uint8_t hours_from_utc,
uint8_t minuted_from_utc
uint8_t minutes_from_utc
}
Also see:
......@@ -193,24 +193,12 @@ class RFC2579DateTime(interface.DateTimeValues):
"""Copies the RFC2579 date-time to a date and time string.
Returns:
str: date and time value formatted as:
YYYY-MM-DD hh:mm:ss.#
str: date and time value formatted as: "YYYY-MM-DD hh:mm:ss.#" or
None if the number of seconds is missing.
"""
if self._number_of_seconds is None:
return
return None
return '{0:04d}-{1:02d}-{2:02d} {3:02d}:{4:02d}:{5:02d}.{6:01d}'.format(
self.year, self.month, self.day_of_month, self.hours, self.minutes,
self.seconds, self.deciseconds)
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
if self._number_of_seconds is None:
return None, None, None
return self.year, self.month, self.day_of_month
......@@ -41,13 +41,7 @@ class SemanticTime(interface.DateTimeValues):
Returns:
bool: True if the date time values are equal to other.
Raises:
ValueError: if other is not an instance of DateTimeValues.
"""
if not isinstance(other, interface.DateTimeValues):
raise ValueError('Other not an instance of DateTimeValues')
if not isinstance(other, SemanticTime):
return False
......@@ -141,13 +135,7 @@ class SemanticTime(interface.DateTimeValues):
Returns:
bool: True if the date time values are not equal to other.
Raises:
ValueError: if other is not an instance of DateTimeValues.
"""
if not isinstance(other, interface.DateTimeValues):
raise ValueError('Other not an instance of DateTimeValues')
if not isinstance(other, SemanticTime):
return True
......@@ -184,6 +172,16 @@ class SemanticTime(interface.DateTimeValues):
"""
return self._string
def CopyToDateTimeStringISO8601(self):
"""Copies the date time value to an ISO 8601 date and time string.
Returns:
str: date and time value formatted as an ISO 8601 date and time string,
which always be None since semantic time cannot be represented in
ISO 8601.
"""
return None
def CopyToStatTimeTuple(self):
"""Copies the semantic timestamp to a stat timestamp tuple.
......@@ -193,15 +191,6 @@ class SemanticTime(interface.DateTimeValues):
"""
return None, None
def GetDate(self):
"""Retrieves the date represented by the date and time values.
Returns:
tuple[int, int, int]: year, month, day of month or (None, None, None)
if the date and time values do not represent a date.
"""
return None, None, None
def GetPlasoTimestamp(self):
"""Retrieves a timestamp that is compatible with plaso.
......@@ -238,13 +227,7 @@ class Never(SemanticTime):