Farsi 库 - 处理日期、日历和日期选择器






4.93/5 (224投票s)
一个用于处理“波斯历”、“伊斯兰历”和“公历”的库,提供 WinForms GUI 控件,专为波斯(Farsi)或阿拉伯语应用程序设计,但也可用于任何使用日历和日期的 Windows 应用程序。

引言
波斯历在大多数使用波斯语的国家使用,尽管有些地区使用不同的月份名称。波斯历是伊朗和阿富汗的官方日历,也是哈萨克斯坦和塔吉克斯坦等地区的替代日历之一。波斯历基于太阳年,长度约为 365 天。一年有四个季节,当太阳从南半球穿越赤道进入北半球时,新的一年开始。新年标志着法瓦尔丁月的第一天,这是北半球春天的第一天。
波斯历的前六个月每月有 31 天,接下来的五个月每月有 30 天,最后一个月在平年有 29 天,在闰年有 30 天。闰年是指除以 33 后余数为 1、5、9、13、17、22、26 或 30 的年份。例如,1370 年是闰年,因为除以 33 的余数为 17。在每 33 年的周期中大约有 8 个闰年。
由于 .NET Framework 1.0 和 1.1 均未提供任何波斯历,而 .NET 2.0 中的波斯历存在错误且无法使用,因此在此我将展示如何编写所需的 DataType
和 GUI 控件来处理此 DataType
。
波斯历类
看起来微软忘记在 .NET 1.1 中提供“波斯历”,虽然他们在 Framework 的第二个版本中确实为这种特殊日历提供了一个类,但他们却以某种方式计算错误。我们将编写一个波斯历,以及一个 DataType
来替代标准的 DateTime
类,同时保持相同的结构。由于需要将标准的 DateTime
转换为 PersianDate
,我还会提供一个转换器类。由于这些类与 GUI 控件结合使用可以最大化其用途,因此我还将提供一个 MonthView
和一个 DatePicker
控件。
设计时集成
我对设计时集成进行了一些更改。由于一些开发人员喜欢使用 PersianDate
,而另一些开发人员则使用 DateTime
类来处理这些库,因此我将这两个属性都公开为 SelectedDate
和 SelectedDateTime
。对于具有 PersianDate
类型的 SelectedDate
,有一个 TypeConverter
可以在设计时将文本转换为 PersianDate
实例。
主题支持
我使用了 .NET 2.0 的 VisualStyleRenderer
,它是 XP 样式的托管包装器。此外,还有一些类用于模拟 Office 2003 渲染。还提供了一个 Office 2000 样式。如果禁用了主题支持或操作系统不支持,控件将使用 Office 2000 样式进行渲染。

弹出窗口和阴影
弹出窗口应带有阴影。对于 RTL(从右到左)控件,阴影应位于控件的左下方。控件中使用的所有字符串都使用本地化管理器类,根据 StringID
枚举获取字符串。要使用本地化版本,您应该将当前线程的 Culture
和 CultureUI
属性更改为定义的区域设置之一:(AR-SA
用于阿拉伯语,FA-IR
用于波斯语,InvariantCulture
用于英语或中性文化。以下是在应用程序的 Main()
方法中进行设置的方法:
//
// The main entry point for the application.
//
[STAThread]
static void Main()
{
Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("fa-IR");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
这是具有标准字符串和 FA-IR
区域设置本地化版本的弹出窗口的正确行为。


使用阿拉伯语和中性区域设置
我主要使用 AR-AE
区域设置处理阿拉伯语,但在版本 1.3.1.0 中,我不得不将其更改为 AR-SA
。这是因为伊斯兰历不是 AR-AE
区域设置的默认日历,而它是 AR-SA
区域设置的默认日历。现在,当您将区域设置设置为阿拉伯语时,控件会以正确的方式绘制。
在中性区域设置中,现在是按从左到右的顺序渲染。通常,控件根据当前区域设置的阅读顺序决定是按 RTL 还是 LTR 渲染。

Using the Code
您可以使用 PersianDate
类,其方式与使用 DateTime
类几乎相同。以下是一些示例:
//
// Use of Persian date class
//
PersianDate pd1 = PersianDate.Now.ToString(); // prints 1385/01/13
// constructs a new instance with the specified vales
PersianDate pd2 = new PersianDate(1386, 4, 26);
// You can use operator overloading, too!
if(pd1 >= pd2)
MessageBox.Show("Date is greater or equal");
// Use of normal DateTime and Conversion
PersianDate pd3 = PersianDateConverter.ToPersianDate(DateTime.Now);
DateTime dt1 = PersianDateConverter.ToGregorianDate(PersianDate.Now);
关注点
请将任何建议/评论/反馈发送到我的电子邮件地址,或使用页面底部的论坛。有关未来的版本或其他库,请访问我的网站。
.NET 1.1 和 VisualStudio .NET 2003 支持
此库已在 VS.NET 2005 和 .NET Framework 2.0 版本上进行了测试。因此,它无法在 VS.NET 2003 上运行。如果您真的需要使其运行,您将不得不将其移植到 VS.NET 2003,并且您将不得不更改代码的绘制部分,因为它实际上使用了 .NET 2.0 的托管类来以 WindowsXP 风格进行绘制。您将不得不使用 Theme API 的包装器(CodeProject 上已有一个项目)来完成这项工作。为了简化移植,您还可以删除 WindowsXP 和 Office 2003 风格的所有绘制,并坚持使用传统的 Office2000 主题,该主题使用 GDI+ 类进行绘制。
WPF 版本
WPF 版本已发布。您可以在 The Code Project 网站的 Vista(Windows Presentation Foundation)部分找到它。我们非常感谢您的反馈和评论。
历史
版本 1.9.0.0
- 已修复:关于波斯/阿拉伯星期几与公历星期几映射错误的错误,这导致了公历中星期几显示错误。
- 已添加:更好地处理多选模式。您可以添加/删除
SelectedDateRange
属性,更改将反映在 UI 上。 - 已添加:
PersianDayOfWeek
枚举,具有正确的日期顺序。 - 已添加:
PersianDate
类的DayOfWeek
属性,用于返回正确的星期几。
版本 1.6.0.0
- 已修复:通过反馈报告的一些错误。
- 已添加:
MessageBox
控件,支持 RTL 和 LTR 视图,并能够记住选定的值,提供标准和自定义MessageBox
按钮。 - 已添加:
PersianDate.ToString()
方法的自定义格式化(类似于DateTime
控件),它提供了返回格式化字符串的功能,例如长日期、长时间、DateTime
等。 - 已添加:自定义绘制每个首选日期。可以与
SelectedDateTimeChanging
事件一起使用,以禁用格式绘制某些日期。
版本 1.5.0.0
- 已修复:
FAMonthView
控件在选择小于MinValue
和大于MaxValue
的日期时发生的异常。 - 已修复:扩大了
PersianDate
MinValue
和MaxValue
类的范围。 - 已修复:Invariant Culture 的
MonthNames
是一个零基索引。Invariant Culture 中的第一个月份名称现在是正确的。 - 已修复:在设置
PersianDate
属性时检查 Year、Month、Day 等值。 - 已修复:在
PersianDate
的!=
和==
运算符上检查null
值。 - 已修复:移除了 GUI 控件中重复的
DateTime
和PersianDate
属性和事件。您可以直接将DateTime
实例转换为PersianDate
。 - 已修复:
DatePicker
的验证过程。 - 已添加:与任何数据源进行完整的双向绑定。
- 已添加:允许在控件中使用其他区域设置和日历。
- 已添加:
DateTime
和PersianDate
的隐式转换。 - 已添加:向
PersianDate
类添加了Millisecond
属性,以提高精度。 - 已添加:
PersianDate
类现在是可序列化的,并实现了以下接口:ICloneable
、IComparable
、IComparable<T>
、IComparer
、IComparer<T>
、IEquatable<T>
。 - 已添加:允许选择
FAMonthView
的滚动功能。您可以按天、月或年滚动。 - 已添加:
FAThemeManager
类,负责处理所有控件的选定主题。要全局更改主题,只需设置该类的Theme
属性。 - 已添加:
FALocalizeManager
类,负责处理其他区域设置。您现在可以将字符串本地化为任何区域设置。 - 已添加:
ToolStrip
支持。现在您可以将控件集成到ToolStrip
、MenuStrip
等中。 - 已添加:Microsoft
DataGridView
自定义列和编辑器支持。
版本 1.4.0.0
- 已添加:包含库提供的功能的完整测试和演示,附带源代码。
- 已添加:文档
- 已添加:
PopupForms
、Controls
层次结构和Painter
类的图表。 - 在
ComboBox
控件上实现了正确的 Office 2003 外观和感觉。 - 实现了
FADatePickerConverter
的正确 RTL 和 LTR 视图。 - Bug 修复:
FADatePicker
控件现在根据其主题显示弹出日历。 - Bug 修复:RTL 和 LTR 模式下弹出控件的正确方向。
- Bug 修复:RTL 和 LTR 模式下弹出控件的正确阴影位置。
- Bug 修复:
FADatePicker
控件未能正确显示文本属性。 - 更改:命名空间的重新定位。
- 已知问题:阿拉伯语字符串的本地化。(有人能帮我一下吗?)
版本 1.3.1.0
- 在非 Windows XP 计算机上或视觉样式被禁用时实现 Windows 2000 绘制。
- 更好地绘制 Windows XP 和 Office 2003 样式。
- 根据用户的区域设置绘制控件。目前允许的区域设置有:中性(公历)、
AR-SA
(伊斯兰历)和FA-IR
(波斯历)。 - 更好的本地化。您可以使用
Localizer
类来更新字符串。 - 支持公历(中性区域设置)和伊斯兰历。
- 对非从右到左的区域设置(例如,中性区域设置、英语区域设置等)进行从左到右渲染。
- 新的
DatePickerConverter
控件,通过按按钮来转换选定的日期。
版本 1
-
提供用于处理“波斯日期”的基础类和 GUI 控件。某些功能(例如,Office 2000 绘制)尚未实现。