在 C# 中,生成日期为自定义控件的UNIX时间

分享于 

14分钟阅读

Web开发

  繁體 雙語

介绍

本文介绍了自定义控件的构造,该控件将UNIX时间转换为有用的可以读日期,以便在WinForms应用程序。 控件将接受标准日期或者UNIX时间值,并可以将值转换为任何方向的( 从UNIX时间到日期或者从日期到UNIX时间)。

图 1: 运行的测试应用程序。

控件包含两个可以设置为控制显示输出和控件可用性的属性。 如果用户单击控件,它将在UNIX时间和正常日期之间启用或者禁用该属性,如果希望允许用户以一种格式编辑值,并在另一个格式中查看该控件,这可能会非常有用。 另一个属性是"方向"。 方向用于确定控件是否将值显示为UNIX时间或者标准日期。

入门

为了开始,解压缩包含的项目,并在 Visual Studio 2008环境中打开解决方案。 在解决方案资源管理器中,应注意以下文件( 图 2 ):

图 2: 解决方案资源管理器。

从图 2中可以看到,有两个项目。 UnixTime 是自定义控件项目,它包含一个自定义控件( UTConverter.cs )。 第二个项目( ControlTest ) 是一个用于测试控件的WinForms应用程序。

自定义控件( utconverter。cs )

自定义控件是扩展标准 TextBox 控件的类。

代码很简单。 如果你需要在IDE中打开代码视图,你将看到代码文件从以下库导入开始:

using System;using System.ComponentModel;using System.Drawing;using System.Text;using System.Windows.Forms;

在导入之后,将定义命名空间和类:

namespace UnixTime
{
 publicpartialclass UTConverter : TextBox
 {

然后定义枚举;这里枚举称为 Direction。 枚举用于定义扩展 TextBox 控件中显示的日期是否将显示日期或者UNIX时间戳值。 可以在声明enumeration成员变量之前或者之后,定义两个 private 成员变量,一个用于跟踪选定的Direction 选项,一个用于确定是否启用了"单击时转换"。

#region Memberspublicenum Direction
 {
 ToUnix,
 ToDate
 }
 private Direction mCurrentDirection;
 privatebool mConvertOnClick;#endregion

接下来,定义构造函数;在构造函数中,通过将 CurrentDirection 属性设置为 Direction.ToDate,并将 ConvertOnClick 属性设置为 true,设置控件的默认值。 默认情况下,控件通常将日期显示为日期,并在单击时将日期转换为UNIX时间戳值。

#region Constructorpublic UTConverter()
 {
 InitializeComponent();
 CurrentDirection = Direction.ToDate;
 ConvertOnClick = true;
 }#endregion

构造器之后,设置一个区域以包含控件属性的添加。 第一个属性为 CurrentDirection,它提供对 mCurrentDirection 成员变量的public 访问,用于确定控件是否将它的值显示为日期。 其他属性 ConvertOnClick 用于启用或者显示在运行时控件中的UNIX和正常日期之间转换的功能。

#region Properties [CategoryAttribute("UNIX Time"),
 Browsable(true),
 BindableAttribute(false),
 DescriptionAttribute("Convert to or from UNIX time.")]
 public Direction CurrentDirection
 {
 get {
 return mCurrentDirection;
 }
 set {
 mCurrentDirection = value;
 }
 }
 [CategoryAttribute("UNIX Time"),
 Browsable(true),
 BindableAttribute(false),
 DescriptionAttribute("Enable or disable On Click UNIX Time format
 conversion.")]
 publicbool ConvertOnClick
 {
 get {
 return mConvertOnClick;
 }
 set {
 mConvertOnClick = value;
 }
 }#endregion

定义的下一个区域为 Methods ;本节包含用于将unix日期转换功能提供给该自定义控件的代码。

#region Methods

ConvertToDateTime 函数将UNIX时间戳转换为短日期 string ;这很容易通过添加为UNIX时间戳提供的秒数来实现。

///<spanclass="code-SummaryComment"><summary></span>/// Convert Unix time to date///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="unixTime"></param></span>privatevoid ConvertToDateTime(double unixTime)
{
 DateTime convertedDateTime =
 new DateTime(1970,1,1,0,0,0).AddSeconds(unixTime);
 this.Text = convertedDateTime.ToShortDateString();
}

下一个函数将日期( 作为短日期字符串) 转换为UNIX时间格式:

///<spanclass="code-SummaryComment"><summary></span>/// Convert date to Unix time///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="dt"></param></span>privatevoid ConvertToUnixTime(DateTime dt)
{
 this.Text = (dt - new DateTime(1970,1,1,0,0,0)).TotalSeconds.ToString();
 // Note: This operation will truncate the value to its// minimum for the date time shown; for example, if"500000000"// is entered into the textbox, this operation will// alter the value to"499996800" which is the// minimum value for the date 11/5/1985. If you// need to maintain the exact Unix time value,// create a separate variable to store it in and// set it to the Unix time stamp prior to// converting from Unix time to a date.}

控件的已经验证事件处理程序用于根据控件属性的CurrentDirection 设置日期或者UNIX时间来更新日期或者UNIX时间值。

///<spanclass="code-SummaryComment"><summary></span>/// Upon validation, update the control to/// display the converted Unix time///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="sender"></param></span>///<spanclass="code-SummaryComment"><paramname="e"></param></span>privatevoid UTConverter_Validated(object sender, EventArgs e)
{
 try {
 if (mCurrentDirection == Direction.ToDate)
 {
 ConvertToDateTime(Convert.ToDouble(this.Text));
 }
 else {
 ConvertToUnixTime(Convert.ToDateTime(this.Text));
 }
 }
 catch { }
}

键按事件处理程序配置为忽略可能键入到控件中的非数值值。 控件接受数字,控制字符和减号。 使用这种方式限制键按键可以使用户输入数字和使用退格键,输入减少 1/1/1970 时的日期。

///<spanclass="code-SummaryComment"><summary></span>/// Disregard non-numeric values; allow/// numbers, controls, and the negative/// sign.///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="sender"></param></span>///<spanclass="code-SummaryComment"><paramname="e"></param></span>privatevoid UTConverter_KeyPress(object sender, KeyPressEventArgs e)
{
 if (!char.IsDigit(e.KeyChar) &&
!char.IsControl(e.KeyChar) &&
 e.KeyChar!= '-')
 {
 e.Handled = true;
 }
}

只要用户退出。输入或者刷新 TextBox,下一位代码就重复调用以更新显示的值。

///<spanclass="code-SummaryComment"><summary></span>/// Update the displayed value to show a date/// in lieu of a Unix time value whenever the/// leave event is fired.///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="sender"></param></span>///<spanclass="code-SummaryComment"><paramname="e"></param></span>privatevoid UTConverter_Leave(object sender, EventArgs e)
 {
 try {
 if (mCurrentDirection == Direction.ToDate)
 {
 ConvertToDateTime(Convert.ToDouble(this.Text));
 }
 else {
 ConvertToUnixTime(Convert.ToDateTime(this.Text));
 }
 }
 catch { }
 }
 ///<spanclass="code-SummaryComment"><summary></span>/// Update the displayed value to show a Unix/// time in lieu of a date whenever the enter/// event is fired.////// Disable this event handler if you do/// not want the time to convert back to/// Unix time///<spanclass="code-SummaryComment"></summary></span>///<spanclass="code-SummaryComment"><paramname="sender"></param></span>///<spanclass="code-SummaryComment"><paramname="e"></param></span>privatevoid UTConverter_Enter(object sender, EventArgs e)
 {
 try {
 if (ConvertOnClick)
 {
 if (mCurrentDirection == Direction.ToDate)
 {
 ConvertToUnixTime(Convert.ToDateTime(this.Text));
 }
 else {
 ConvertToDateTime(Convert.ToDouble(this.Text));
 }
 }
 }
 catch { }
 }
 ///<spanclass="code-SummaryComment"><summary></span>/// Override the base refresh method/// to update the display of each value///<spanclass="code-SummaryComment"></summary></span>publicoverridevoid Refresh()
 {
 base.Refresh();
 // convert to date whenever control// is refreshedtry {
 if (mCurrentDirection == Direction.ToDate)
 {
 ConvertToDateTime(Convert.ToDouble(this.Text));
 }
 else {
 ConvertToUnixTime(Convert.ToDateTime(this.Text));
 }
 }
 catch { }
 }#endregion }
}

包装控件的内容。 下一节将讨论示范项目。

主窗体( 来自控件测试项目的form1.cs )

测试窗体包含自定义控件的八个实例;每个实例都用于显示不同的控件。 四个使用短日期 string 加载,四个用UNIX时间戳加载。 在两个组中,每个控件都设置了启用和禁用的ConvertOnClick 方法,并且 Direction 选项设置为 ToDate 或者 ToUnix。 在窗体中添加了一个工具提示,它被设置为描述当用户悬停在控件上时所选的每个选项。

表单的代码完整地显示在下面。 窗体加载事件处理程序中的代码被注释为描述每个节完成的内容。

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace ControlTest
{
 publicpartialclass Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }
 privatevoid button1_Click(object sender, EventArgs e)
 {
 this.Dispose();
 }
 privatevoid Form1_Load(object sender, EventArgs e)
 {
 // use negative numbers to express dates// prior to 1/1/1970// load with Unix time utConverter1.Text = "-885772800"; // a date prior to 1/1/1970 utConverter2.Text = "849312000";
 utConverter3.Text = "999648000";
 utConverter4.Text = "4000000000";
 // load with normal dates utConverter5.Text = "7/19/1960";
 utConverter6.Text = "5/16/1933";
 utConverter7.Text = "7/4/2008";
 utConverter8.Text = "6/18/3100";
 // refresh all of the controls// to update the display utConverter1.Refresh();
 utConverter2.Refresh();
 utConverter3.Refresh();
 utConverter4.Refresh();
 utConverter5.Refresh();
 utConverter6.Refresh();
 utConverter7.Refresh();
 utConverter8.Refresh();
 // move selection off custom controls button1.Select();
 }
 }
}

摘要

本文旨在描述自定义控件,它具有在UNIX时间戳格式和普通短日期 string 之间转换值的特殊目的。 这个项目是描述如何创建自定义控件的简单示例,可以使用类似的方法来使用现有控件。

历史记录

  • 第三 2008年06月: 初始日志