Fixed a couple of calendar conversion bugs.

This commit is contained in:
Daniel Stolt
2014-08-03 02:16:04 +02:00
parent 3cdfd6848b
commit 3951fb79d1
6 changed files with 43 additions and 22 deletions

View File

@@ -49,6 +49,11 @@ namespace Orchard.Fields.Drivers {
options.EnableTimeZoneConversion = false;
}
// Don't do any calendar conversion if field is semantically a time-only field, because the date component might we out of allowed boundaries for the current calendar.
if (settings.Display == DateTimeFieldDisplays.TimeOnly) {
options.EnableCalendarConversion = false;
}
var showDate = settings.Display == DateTimeFieldDisplays.DateAndTime || settings.Display == DateTimeFieldDisplays.DateOnly;
var showTime = settings.Display == DateTimeFieldDisplays.DateAndTime || settings.Display == DateTimeFieldDisplays.TimeOnly;
@@ -80,6 +85,11 @@ namespace Orchard.Fields.Drivers {
options.EnableTimeZoneConversion = false;
}
// Don't do any calendar conversion if field is semantically a time-only field, because the date component might we out of allowed boundaries for the current calendar.
if (settings.Display == DateTimeFieldDisplays.TimeOnly) {
options.EnableCalendarConversion = false;
}
var showDate = settings.Display == DateTimeFieldDisplays.DateAndTime || settings.Display == DateTimeFieldDisplays.DateOnly;
var showTime = settings.Display == DateTimeFieldDisplays.DateAndTime || settings.Display == DateTimeFieldDisplays.TimeOnly;
@@ -113,6 +123,11 @@ namespace Orchard.Fields.Drivers {
options.EnableTimeZoneConversion = false;
}
// Don't do any calendar conversion if field is semantically a time-only field, because the date component might we out of allowed boundaries for the current calendar.
if (settings.Display == DateTimeFieldDisplays.TimeOnly) {
options.EnableCalendarConversion = false;
}
var showDate = settings.Display == DateTimeFieldDisplays.DateAndTime || settings.Display == DateTimeFieldDisplays.DateOnly;
var showTime = settings.Display == DateTimeFieldDisplays.DateAndTime || settings.Display == DateTimeFieldDisplays.TimeOnly;

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace Orchard.Localization.Models {
@@ -37,11 +38,15 @@ namespace Orchard.Localization.Models {
}
}
public DateTime ToDateTime() {
return new DateTime(
public DateTime ToDateTime(Calendar calendar) {
return calendar.ToDateTime(
_year > 0 ? _year : DateTime.MinValue.Year,
_month > 0 ? _month : DateTime.MinValue.Month,
_day > 0 ? _day : DateTime.MinValue.Day
_day > 0 ? _day : DateTime.MinValue.Day,
DateTime.MinValue.Hour,
DateTime.MinValue.Minute,
DateTime.MinValue.Second,
DateTime.MinValue.Millisecond
);
}

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
namespace Orchard.Localization.Models {
@@ -41,8 +42,8 @@ namespace Orchard.Localization.Models {
}
}
public DateTime ToDateTime() {
return new DateTime(
public DateTime ToDateTime(Calendar calendar) {
return calendar.ToDateTime(
Date.Year > 0 ? Date.Year : DateTime.MinValue.Year,
Date.Month > 0 ? Date.Month : DateTime.MinValue.Month,
Date.Day > 0 ? Date.Day : DateTime.MinValue.Day,

View File

@@ -108,12 +108,10 @@ namespace Orchard.Localization.Services {
var formatString = ConvertToFormatString(format, replacements);
var calendar = CurrentCalendar;
var dateTime = parts.ToDateTime();
int twoDigitYear, hour12;
bool isPm;
string monthName, monthNameShort, monthNameGenitive, monthNameShortGenitive, dayName, dayNameShort, amPm, amPmShort, timeZone;
GetDateFormatValues(parts.Date, calendar, dateTime, out twoDigitYear, out monthName, out monthNameShort, out monthNameGenitive, out monthNameShortGenitive, out dayName, out dayNameShort);
GetDateFormatValues(parts.Date, calendar, out twoDigitYear, out monthName, out monthNameShort, out monthNameGenitive, out monthNameShortGenitive, out dayName, out dayNameShort);
GetTimeFormatValues(parts.Time, out isPm, out hour12, out amPm, out amPmShort, out timeZone);
return String.Format(formatString, parts.Date.Year, twoDigitYear, parts.Date.Month, monthName, monthNameShort, monthNameGenitive, monthNameShortGenitive, parts.Date.Day, dayName, dayNameShort, parts.Time.Hour, hour12, parts.Time.Minute, parts.Time.Second, parts.Time.Millisecond, amPm, amPmShort, timeZone);
@@ -130,11 +128,9 @@ namespace Orchard.Localization.Services {
var formatString = ConvertToFormatString(format, replacements);
var calendar = CurrentCalendar;
var dateTime = parts.ToDateTime();
int twoDigitYear;
string monthName, monthNameShort, monthNameGenitive, monthNameShortGenitive, dayName, dayNameShort;
GetDateFormatValues(parts, calendar, dateTime, out twoDigitYear, out monthName, out monthNameShort, out monthNameGenitive, out monthNameShortGenitive, out dayName, out dayNameShort);
GetDateFormatValues(parts, calendar, out twoDigitYear, out monthName, out monthNameShort, out monthNameGenitive, out monthNameShortGenitive, out dayName, out dayNameShort);
return String.Format(formatString, parts.Year, twoDigitYear, parts.Month, monthName, monthNameShort, monthNameGenitive, monthNameShortGenitive, parts.Day, dayName, dayNameShort);
}
@@ -147,8 +143,6 @@ namespace Orchard.Localization.Services {
var replacements = GetTimeFormatReplacements();
var formatString = ConvertToFormatString(format, replacements);
var dateTime = parts.ToDateTime();
bool isPm;
int hour12;
string amPm, amPmShort, timeZone;
@@ -260,15 +254,15 @@ namespace Orchard.Localization.Services {
return new TimeParts(hour, minute, second, millisecond);
}
protected virtual void GetDateFormatValues(DateParts parts, Calendar calendar, DateTime dateTime, out int twoDigitYear, out string monthName, out string monthNameShort, out string monthNameGenitive, out string monthNameShortGenitive, out string dayName, out string dayNameShort) {
protected virtual void GetDateFormatValues(DateParts parts, Calendar calendar, out int twoDigitYear, out string monthName, out string monthNameShort, out string monthNameGenitive, out string monthNameShortGenitive, out string dayName, out string dayNameShort) {
var yearString = parts.Year.ToString("00", System.Globalization.CultureInfo.InvariantCulture);
twoDigitYear = Int32.Parse(yearString.Substring(yearString.Length - 2));
monthName = parts.Month > 0 ? _dateTimeFormatProvider.MonthNames[parts.Month - 1] : null;
monthNameShort = parts.Month > 0 ? _dateTimeFormatProvider.MonthNamesShort[parts.Month - 1] : null;
monthNameGenitive = parts.Month > 0 ? _dateTimeFormatProvider.MonthNamesGenitive[parts.Month - 1] : null;
monthNameShortGenitive = parts.Month > 0 ? _dateTimeFormatProvider.MonthNamesShortGenitive[parts.Month - 1] : null;
dayName = parts.Day > 0 ? _dateTimeFormatProvider.DayNames[(int)calendar.GetDayOfWeek(dateTime)] : null;
dayNameShort = parts.Day > 0 ? _dateTimeFormatProvider.DayNamesShort[(int)calendar.GetDayOfWeek(parts.ToDateTime())] : null;
dayName = parts.Day > 0 ? _dateTimeFormatProvider.DayNames[(int)calendar.GetDayOfWeek(parts.ToDateTime(calendar))] : null;
dayNameShort = parts.Day > 0 ? _dateTimeFormatProvider.DayNamesShort[(int)calendar.GetDayOfWeek(parts.ToDateTime(calendar))] : null;
}
protected virtual void GetTimeFormatValues(TimeParts parts, out bool isPm, out int hour12, out string amPm, out string amPmShort, out string timeZone) {

View File

@@ -88,9 +88,10 @@ namespace Orchard.Localization.Services {
}
var parts = DateTimeParts.FromDateTime(dateValue);
if (options.EnableCalendarConversion && !(CurrentCalendar is GregorianCalendar)) {
parts = ConvertToSiteCalendar(dateValue);
}
// No calendar conversion in this method - we expect the date component to be DateTime.MinValue and irrelevant anyway.
//if (options.EnableCalendarConversion && !(CurrentCalendar is GregorianCalendar)) {
// parts = ConvertToSiteCalendar(dateValue);
//}
return _dateFormatter.FormatDateTime(parts, _dateTimeFormatProvider.LongTimeFormat);
}
@@ -150,10 +151,13 @@ namespace Orchard.Localization.Services {
hasTime ? _dateFormatter.ParseTime(timeString) : TimeParts.MinValue
);
var dateValue = parts.ToDateTime();
DateTime dateValue;
if (hasDate && options.EnableCalendarConversion && !(CurrentCalendar is GregorianCalendar)) {
dateValue = ConvertFromSiteCalendar(parts);
}
else {
dateValue = parts.ToDateTime(new GregorianCalendar());
}
if (hasTime && options.EnableTimeZoneConversion) {
// If there is no date component (technically the date component is that of DateTime.MinValue) then
@@ -183,10 +187,13 @@ namespace Orchard.Localization.Services {
var parts = _dateFormatter.ParseDateTime(dateTimeString);
var dateValue = parts.ToDateTime();
DateTime dateValue;
if (options.EnableCalendarConversion && !(CurrentCalendar is GregorianCalendar)) {
dateValue = ConvertFromSiteCalendar(parts);
}
else {
dateValue = parts.ToDateTime(new GregorianCalendar());
}
if (options.EnableTimeZoneConversion) {
dateValue = ConvertFromSiteTimeZone(dateValue);

View File

@@ -3,7 +3,6 @@ TODO:
* Add formatting and parsing of time zone information (add timezone properties to TimeParts structure)
* Write unit tests for DefaultDateLocalizationServices
* Add support for the different Gregorian calendar types
* Make sure DateTimeField, ArchiveLaterPart and PublishLaterPart handle Persian dates correctly.
* Improve CultureDateTimeFormatProvider to return correct information for fa-IR culture when PersianCalendar is in use.
BREAKING: