一、这是我做的第二个小的程序,是一个能够实时显示时间,并且通过点击能够来获取到一个时间,可以输入秒数来进行加减。由于之前一直在学习控制台从来没用过winform,所以花费的时间比较长。
二、学习记录
1、第一个时间实时显示器比较容易,需要使用Timer这个控件,这个控件的Now方法是可以去直接获取我们的实时时间,所以第一个要求比较简单,只需要创建一个label或者textbox然后将获得时间字符串赋值给label.Text或者textBox.text即可。
2、第二是获取一个时间,然后输入一个时间(秒)然后将我输入的时间加到我获得到的时间上,然后输出。上面这段话如果要实现,我看完后分为了四个步骤:1.获取时间,2.输入时间,3.进行时间加,4.输出;然后我开始逐步的进行是实现:
(1)获取时间,我使用的是textBox.Text,我在上一个textBox里能够获得时间,然后我创建了一个betton,然后我写到
private void button1_Click(object sender, EventArgs e)
{
string a = DateTime.Now.ToString(); //设立一个字符串a,每当点击button时,将点击时的时间赋值给字符串a;
textBox1.Text = a;//将字符串a的值显示到laber上。
}
如果你将DataTime.Now.ToString();放到textBox里面,那么他会一直执行这个指令,()
但是如果你放到一个betton下,当你点击一次时,a就会拿到一个现在的实时的时间,这样我们就完成了获取时间,这个时间是字符串;
(2)输入时间,我们同样使用这个textBox控件,textBox.Text的意思是输入框的文字,当你将放到右边的时候,你左边给一个字符串变量,他就会把输入框的文字送到变量里,如果想使用输入框里面的内容那就使用变量就可以,反之则在输入框里面显示出来,我们上面用的就是这个。当然你也可以不创建变量,直接在你需要的地方引用textBox.Box就好也是可以的。
(3)计算时间,我们已经拿到了两个值,一个是我们输入的时间,一个获得的时间,我们要将我们输入的时间加到我们获得的时间上,这里需要用到字符串切割,因为我们获得的时间是xxxx/xx/xx xx:xx:xx这样的格式,当我做到这里的时候我本来想用的是通过位数来控制我拿到对应位置的时间,
int start = 0;
int length = 0;
public string replaceStringChar(int a,string b,string Time)
{
string x = "";
string y = "";
x = Time.Substring(0, a - 1);
y = Time.Substring(a + 1);
return (x + b + y);
}
向上面那样,使用Substring这个方法来使用,当我花时间写完这个代码的时候,我就开始利用这个方法去获取second,minute,hour,但是当我获取到hour时,当时刚好凌晨3点,我突然发现3点,那如果是13点呢,然后我就去看时间,后来我发现时间的位数不是固定的month,day,hour,minute,second是会变化的,也就是说我通过这个去获取我所需要的数字是会出错的,我会获得"/'":"这种符号,当我把变化写出来的时候,我觉得如果按这种写法,我可能需要很长时间,但是,这个时候我看到了一个让我不能使用这个方法的元凶。符号,符号!我看到了使用符号切割的方法,这样子我就可以不用去看他们到底是几位,只需要按照"/""/"" "":"":"这个顺序,那就可以获得我想要的顺序。
所以我使用下面的代码
public int PartitionTime(string a, int xuanZe)//将从输入框得到的时间(字符串)通过"/"" "":"拆开,通过选择拿到年,月,日,时,分,秒。
{
string[] x = a.Split(new char[3] { '/', ' ', ':' });
string myArray = "";
int intMyArray = 999;
switch (xuanZe)
{
case 1:
{
myArray = Convert.ToString(x[5]);//second
intMyArray = Convert.ToInt32(myArray);
break;
}
case 2:
{
myArray = Convert.ToString(x[4]);//miunte
intMyArray = Convert.ToInt32(myArray);
break;
}
case 3:
{
myArray = Convert.ToString(x[3]);//hour
intMyArray = Convert.ToInt32(myArray);
break;
}
case 4:
{
myArray = Convert.ToString(x[2]);//day
intMyArray = Convert.ToInt32(myArray);
break;
}
case 5:
{
myArray = Convert.ToString(x[1]);//month
intMyArray = Convert.ToInt32(myArray);
break;
}
case 6:
{
myArray = Convert.ToString(x[0]);//year
intMyArray = Convert.ToInt32(myArray);
break;
}
default:
myArray = "本方法使用xxxx/xx/xx xx:xx:xx的时间切割环";
break;
}
return intMyArray;
}
通过Split方法切割字符串,成功的获得了我们的所有位置的时间;
解决了获取到对应时间的问题后,我开始想时间进位的逻辑:
if second满60进一
if minute满60进一
if hour满24进一
这是我想写day满30进一,但是月不止有30,还有29/28/31天,所以我们就需要去分开他们,
我使用了while方法,通过获取对应位置的month来选选择到底是去算多少天,
二月则增加一个闰年的计算(你可以将年份除以4,或者使用DateTime.IsLeapYear这个方法来得到是否为闰年),判断是闰年还是非闰年,来去判断是进行减去29还是28;
然后设定一个循环,将我获得的day和hour进位加起来减去每个月的值,当不满足一个月的天数的时候,我就将余数放到一个变量里当成month余位,然后每次循环当前月加一,每当月份大余12是将当前月重置为1,然后month进位加一,这样就可以获得到进的年份,到此,所有的时间已经获得到了,然后我将if语句的else补齐就可以了。
然后将每一个部分的转换成字符串加起来,就可以得到我们计算过的时间;
4、输出,再次使用textBox语句然后将输出即可。
全部代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 时间计算器
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*
1,显示实时时间
2, 根据输入的值, 去获取想要的时间
3,时间跟日期要分开,求输入值是日期,得到的日期跟时间中,时间不会变,日期变化;输入的值是时间,分情况,可能日期不变,可能日期时间都变
4, 输入值的时间日期都是int类型, 日期单位是天, 时间单位是秒, 代码实现年月日转换, 时分秒转换
用winform窗体做
获取时间的控件是timer*/
//class Replacement
//{
// int start = 0;
// int length = 0;
// public string replaceStringChar(int a,string b,string Time)
// {
// string x = "";
// string y = "";
// x = Time.Substring(0, a - 1);
// y = Time.Substring(a + 1);
// return (x + b + y);
// }
// public string conversionTime(int start, int length, string Time, int second)
// {
// int x = Convert.ToInt32(Time.Substring(start, length));
// int a;
// int b;
// int c;
// int d;
// int e;
// int f;
// if ((second + x >= 60))
// {
// a = (second + x) % 60;
// b = (second + x) / 60;
// int y = Convert.ToInt32(Time.Substring(start - 3, length - 3));
// if (y + b >= 60)
// {
// c = (y + b) % 60;
// d = (y + b) / 60;
// int z = Convert.ToInt32(Time.Substring(start - 6, length - 6));
// if ((z+d>=24))
// {
// e = (z + d) % 24;
// f = (z + d) / 24;
// return (Convert.ToString (f)+":"+Convert.ToString (e)+":"+Convert.ToString(c)+":"+Convert.ToString(a));
// }
// else
// {
// return ( Convert.ToString(z+d) + ":" + Convert.ToString(c) + ":" + Convert.ToString(a));
// }
// }
// else
// {
// return ( Convert.ToString(y+b) + ":" + Convert.ToString(a));
// }
// }
// else
// {
// return (Convert.ToString(second));
// }
// }
//}
class Replacement
{
public int PartitionTime(string a, int xuanZe)//将从输入框得到的时间(字符串)通过"/"" "":"拆开,通过选择拿到年,月,日,时,分,秒。
{
string[] x = a.Split(new char[3] { '/', ' ', ':' });
string myArray = "";
int intMyArray = 999;
switch (xuanZe)
{
case 1:
{
myArray = Convert.ToString(x[5]);//second
intMyArray = Convert.ToInt32(myArray);
break;
}
case 2:
{
myArray = Convert.ToString(x[4]);//miunte
intMyArray = Convert.ToInt32(myArray);
break;
}
case 3:
{
myArray = Convert.ToString(x[3]);//hour
intMyArray = Convert.ToInt32(myArray);
break;
}
case 4:
{
myArray = Convert.ToString(x[2]);//day
intMyArray = Convert.ToInt32(myArray);
break;
}
case 5:
{
myArray = Convert.ToString(x[1]);//month
intMyArray = Convert.ToInt32(myArray);
break;
}
case 6:
{
myArray = Convert.ToString(x[0]);//year
intMyArray = Convert.ToInt32(myArray);
break;
}
default:
myArray = "本方法使用xxxx/xx/xx xx:xx:xx的时间切割环";
break;
}
return intMyArray;
}
public string conversionTime(string shiJian, int second)
{
int secondY = 0; ;//秒余位
int secondJ;//秒进位
int minuteY = PartitionTime(shiJian, 2);//分余位
int minuteJ;//分进位
int hourY = PartitionTime(shiJian, 3);//时余位
int hourJ;//时进位
int dayY = PartitionTime(shiJian, 4);//天余位
int monthY = PartitionTime(shiJian, 5);//月余位
int monthJ = 0;//月进位
int yearY = PartitionTime(shiJian,6);//年余位
bool xuanze = DateTime.IsLeapYear((yearY + monthJ));
if ((second + PartitionTime(shiJian, 1)) >= 60)//计算秒数与获取时间的和是否是大于60,若大于六十则进位;
{
secondY = (second + PartitionTime(shiJian, 1)) % 60;
secondJ = (second + PartitionTime(shiJian, 1)) / 60;
if ((secondJ+PartitionTime(shiJian,2))>= 60)//计算分钟数与获取时间的和是否是大于60,若大于六十则进位;
{
minuteY = (secondJ + PartitionTime(shiJian, 2)) % 60;
minuteJ = (secondJ + PartitionTime(shiJian, 2)) / 60;
if ((minuteJ + PartitionTime(shiJian, 3)) >= 24)//计算小时数与获取时间的和是否是大于60,若大于六十则进位;
{
hourY = (minuteJ + PartitionTime(shiJian, 3))% 24;
hourJ = (minuteJ + PartitionTime(shiJian, 3)) / 24;
int y = (hourJ + PartitionTime(shiJian, 4));//存入小时数,因为进入循环时如果使用方法,会重复调用我们截取到的时间,这里放入一个变量可以避免使用方法;
for (int i = 0; !(i ==-1); )//小时数进天数,由于月份不同,每个月的天数也不同,所以不能用除法,得用减法,所以使用循环来进行;
{
if (monthY > 12)//这是当月余位大于12时,在月进位加一,同时将月余位重置为1;
{
monthJ++;
monthY = 1;
}
else
{
switch (monthY)//用来判断那个月;
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12://大月时减去31天;
{
if (y - 31 > 0)
{
y= y - 31;
monthY++;
}
else//若小余等于31天则将i重置为-1.跳出for循环;
{
dayY = y;
i = -1;
}
break;
}
case 2:
{
if (xuanze)//判断是否是闰年;
{
if ((y - 29) > 0)//闰年减去29天;
{
y = y - 29;
monthY++;
}
else//若小余等于29天则将i重置为-1.跳出for循环;
{
dayY = y;
i = -1;
}
}
else
{
if ((y - 28) > 0)//非闰年时减去28天;
{
y = y - 31;
monthY++;
}
else//若小余等于28天则将i重置为-1.跳出for循环;
{
dayY = y;
i = -1;
}
}
break;
}
case 4:
case 6:
case 9:
case 11:
{
if (y - 30 > 0)//小月减去30天;
{
y= y - 30;
monthY++;
}
else//若小余等于30天则将i重置为-1.跳出for循环;
{
dayY = y;
i = -1;
}
break;
}
}
}
}
}
else if ((minuteJ + PartitionTime(shiJian, 3)) < 24)//当分进位加小时数小于24时,时余位等于分进位加小时数;
{
hourY = (minuteJ + PartitionTime(shiJian, 3)) ;
}
}
else if ((secondJ + PartitionTime(shiJian, 2)) < 60) //当秒进位分钟时数小于60时,分余位等于秒进位加分钟数;
{
minuteY = minuteY = (secondJ + PartitionTime(shiJian, 2)) % 60;
}
}
else if ((second + PartitionTime(shiJian, 1)) < 60) //你输入的秒数加秒数小于60时,秒余位等于你输入的秒数加秒数;
{
secondY = (second + PartitionTime(shiJian, 1));
}
yearY = PartitionTime(shiJian, 6) + monthJ;//由于年份不需要进位,直接加即可;
string stringSecond= Convert.ToString(secondY);//将他们转化为字符串并拼接;
string stringMinute = Convert.ToString(minuteY);
string stringHour = Convert.ToString(hourY);
string stringDay = Convert.ToString(dayY);
string stringMonth = Convert.ToString(monthY);
string stringYear = Convert.ToString(yearY);
string finalTime = stringYear + "/" + stringMonth + "/" + stringDay + " " + stringHour + ":" + stringMinute + ":" + stringSecond;
return finalTime;//返回时间;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string a = DateTime.Now.ToString(); //设立一个字符串a,每当点击button时,将点击时的时间赋值给字符串a;
textBox1.Text = a;//将字符串a的值显示到laber上。
}
private void button2_Click(object sender, EventArgs e)
{
Replacement myReplacment = new Replacement();//实例话方法
textBox2.Text=myReplacment.conversionTime(textBox1.Text, Convert.ToInt32(textBox4.Text));//调用方法;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
}
private void label1_Click(object sender, EventArgs e)
{
}
private void label2_Click(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void label4_Click(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox3.Text = DateTime.Now.ToString();//通过timer控件获取时间并交给laber;
}
}
}