blob: 149102e249d745ef146708863a6e2e7ee24eede3 [file] [log] [blame]
using Lucene.Net.Support;
using System;
using System.Globalization;
namespace Lucene.Net.QueryParsers.Flexible.Standard.Config
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/// <summary>
/// LUCENENET specific enum for mimicking the Java DateFormat
/// </summary>
public enum DateFormat
{
FULL, LONG,
MEDIUM, SHORT
}
/// <summary>
/// This <see cref="NumberFormat"/> parses <see cref="long"/> into date strings and vice-versa. It
/// uses the given <c>dateFormat</c> and <see cref="CultureInfo">locale</see> to parse and format dates, but before, it
/// converts <see cref="long"/> to <see cref="DateTime"/> objects or vice-versa.
/// <para/>
/// Note that the <see cref="long"/> value the dates are parsed into and out of represent the number of milliseconds
/// since January 1, 1970 0:00:00, also known as the "epoch".
/// </summary>
public class NumberDateFormat : NumberFormat
{
//private static readonly long serialVersionUID = 964823936071308283L;
// The .NET ticks representing January 1, 1970 0:00:00 GMT, also known as the "epoch".
public const long EPOCH = 621355968000000000;
private string dateFormat;
private readonly DateFormat dateStyle;
private readonly DateFormat timeStyle;
private TimeZoneInfo timeZone = TimeZoneInfo.Local;
/// <summary>
/// Constructs a <see cref="NumberDateFormat"/> object using the given <paramref name="dateFormat"/>
/// and <paramref name="locale"/>.
/// </summary>
/// <param name="dateFormat">Date format used to parse and format dates</param>
/// <param name="locale"></param>
public NumberDateFormat(string dateFormat, CultureInfo locale)
: base(locale)
{
this.dateFormat = dateFormat;
}
/// <summary>
/// Constructs a <see cref="NumberDateFormat"/> object using the given <paramref name="dateStyle"/>,
/// <paramref name="timeStyle"/>, and <paramref name="locale"/>.
/// </summary>
public NumberDateFormat(DateFormat dateStyle, DateFormat timeStyle, CultureInfo locale)
: base(locale)
{
this.dateStyle = dateStyle;
this.timeStyle = timeStyle;
}
public virtual TimeZoneInfo TimeZone
{
get { return this.timeZone; }
set { this.timeZone = value; }
}
public override string Format(double number)
{
return new DateTime(EPOCH).AddMilliseconds(number).ToString(GetDateFormat(), this.locale);
}
public override string Format(long number)
{
return new DateTime(EPOCH).AddMilliseconds(number).ToString(GetDateFormat(), this.locale);
}
public override object Parse(string source)
{
// Try exact format first, if it fails, do a loose DateTime.Parse
DateTime d;
d = DateTime.ParseExact(source, GetDateFormat(), this.locale, DateTimeStyles.None);
return (d - new DateTime(EPOCH)).TotalMilliseconds;
}
public override string Format(object number)
{
return new DateTime(EPOCH).AddMilliseconds(Convert.ToInt64(number, CultureInfo.InvariantCulture)).ToString(GetDateFormat(), this.locale);
}
public void SetDateFormat(string dateFormat)
{
this.dateFormat = dateFormat;
}
/// <summary>
/// Returns the .NET date format that will be used to Format the date.
/// Note that parsing the date uses <see cref="DateTime.ParseExact(string, string, IFormatProvider)"/>.
/// </summary>
// LUCENENET specific
public string GetDateFormat()
{
if (dateFormat != null) return dateFormat;
return GetDateFormat(this.dateStyle, this.timeStyle, this.locale);
}
public static string GetDateFormat(DateFormat dateStyle, DateFormat timeStyle, CultureInfo locale)
{
string datePattern = "", timePattern = "";
switch (dateStyle)
{
case DateFormat.SHORT:
datePattern = locale.DateTimeFormat.ShortDatePattern;
break;
case DateFormat.MEDIUM:
datePattern = locale.DateTimeFormat.LongDatePattern
.Replace("dddd,", "").Replace(", dddd", "") // Remove the day of the week
.Replace("MMMM", "MMM"); // Replace month with abbreviated month
break;
case DateFormat.LONG:
datePattern = locale.DateTimeFormat.LongDatePattern
.Replace("dddd,", "").Replace(", dddd", ""); // Remove the day of the week
break;
case DateFormat.FULL:
datePattern = locale.DateTimeFormat.LongDatePattern;
break;
}
switch (timeStyle)
{
case DateFormat.SHORT:
timePattern = locale.DateTimeFormat.ShortTimePattern;
break;
case DateFormat.MEDIUM:
timePattern = locale.DateTimeFormat.LongTimePattern;
break;
case DateFormat.LONG:
timePattern = locale.DateTimeFormat.LongTimePattern.Replace("z", "").Trim() + " z";
break;
case DateFormat.FULL:
timePattern = locale.DateTimeFormat.LongTimePattern.Replace("z", "").Trim() + " z"; // LUCENENET TODO: Time zone info not being added to match behavior of Java, but Java doc is unclear on what the difference is between this and LONG
break;
}
return string.Concat(datePattern, " ", timePattern);
}
}
}