/* Copyright 2006,2008 Stefano Chizzolini. http://clown.stefanochizzolini.it Contributors: * Stefano Chizzolini (original code developer, http://www.stefanochizzolini.it) This file should be part of the source code distribution of "PDF Clown library" (the Program): see the accompanying README files for more info. This Program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This Program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, either expressed or implied; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more details. You should have received a copy of the GNU General Public License along with this Program (see README files); if not, go to the GNU website (http://www.gnu.org/). Redistribution and use, with or without modification, are permitted provided that such redistributions retain the above copyright notice, license and disclaimer, along with this list of conditions. */ using System; using System.Globalization; using System.Text; namespace it.stefanochizzolini.clown.objects { /** PDF date object [PDF:1.6:3.8.3]. */ public class PdfDate : PdfString { #region static #region fields private static readonly Encoding ASCIIEncoding = Encoding.ASCII; #endregion #region interface #region public public static DateTime ToDateTime( string value ) { //TODO:IMPL this code is quite ugly... is there a more elegant solution? // Normalize datetime value. // Cut leading "D:" tag! value = value.Substring(2); int length = value.Length; switch(length) { case 8: // Date only. value += "000000+00:00"; break; case 14: // Datetime without timezone. value += "+00:00"; break; case 15: // Datetime at UT timezone ("Z" tag). value = value.Substring(0,length-1) + "+00:00"; break; case 17: // Datetime at non-UT timezone without minutes. value += ":00"; break; case 21: // Datetime at non-UT full timezone ("'mm'" PDF timezone-minutes format). value = value.Substring(0,length-1).Replace('\'',':'); break; } // Try Parse datetime value! // Modifed to handle incorrect CreationDate of a PDF document. Instead, it automatically uses current PC local DateTime. try { return DateTime.ParseExact(value, "yyyyMMddHHmmsszzz", new CultureInfo("en-US")); } catch (FormatException e) { return DateTime.Now; } } #endregion #region protected protected static string Format( DateTime value ) {return ("D:" + value.ToString("yyyyMMddHHmmsszzz").Replace(':','\'') + "'");} #endregion #endregion #endregion #region dynamic #region constructors public PdfDate( ) {} public PdfDate( DateTime value ) {Value = value;} #endregion #region interface #region public public override object Clone( files.File context ) { // Shallow copy. return this.MemberwiseClone(); } public override Object Value { get {return ToDateTime(ASCIIEncoding.GetString(RawValue));} set {RawValue = ASCIIEncoding.GetBytes(Format((DateTime)value));} } #endregion #endregion #endregion } }