mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Fixed a couple of calendar conversion bugs.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -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,
|
||||
|
@@ -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) {
|
||||
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user