public function setValue($timestamp, $type = self::UNIX_TIMESTAMP)
    {
        switch ($type) {
            case self::UNIX_TIMESTAMP:
                $this->day_count = $this->convertUnixToJd($timestamp);
                $this->seconds = $timestamp % 86400;
                break;

            case self::EXIF_STRING:
                /* Clean the timestamp: some timestamps are broken other
                 * separators than ':' and ' '. */
                $d = preg_split('/[^0-9]+/', $timestamp);
                for ($i = 0; $i < 6; $i ++) {
                    if (empty($d[$i])) {
                        $d[$i] = 0;
                    }
                }
                $this->day_count = $this->convertGregorianToJd($d[0], $d[1], $d[2]);
                $this->seconds = $d[3] * 3600 + $d[4] * 60 + $d[5];
                break;

            case self::JULIAN_DAY_COUNT:
                $this->day_count = (int) floor($timestamp);
                $this->seconds = (int) (86400 * ($timestamp - floor($timestamp)));
                break;

            default:
                throw new PelInvalidArgumentException(
                    'Expected UNIX_TIMESTAMP (%d), ' . 'EXIF_STRING (%d), or ' . 'JULIAN_DAY_COUNT (%d) for $type, got %d.',
                    self::UNIX_TIMESTAMP,
                    self::EXIF_STRING,
                    self::JULIAN_DAY_COUNT,
                    $type
                );
        }

        /*
         * Now finally update the string which will be used when this is
         * turned into bytes.
         */
        parent::setValue($this->getValue(self::EXIF_STRING));
    }