c#将当前时间减1天或几个小时以时间戳为结果(附常用时间转换案例)

c#当前时间减1天或几个小时并转换UNIX时间戳显示

本文url:DateTimeAddHoursTounixtime

c#将当前时间减1天或几个小时以时间戳为结果[我正在用的最终版本]

因本文是倒腾了好几次才拼凑而成 可能与主题分散了一些故标记了一个url方便记录

public string gt(string stime)
 {
if(string.IsNullOrEmpty(stime)) 
{
     string stimes ="3";
     return stimes;
}
else
{
  try
      {
     int stimes = int.Parse(stime);
     return stimes.ToString();
      }
      catch (Exception)
      {
     string stimes ="3";
     return stimes;
      }
}
//为空则3赋给stimes,否则判断是否是数字,不是则3赋给stimes,是则转为int赋给stimes
}
public void Run(Dictionary<string, string> stringDic, Dictionary<string, List<string>> listDic, Dictionary<string, int> intDic, Dictionary<string, Dictionary<string, string>> rowDic)
{
    int stimes = Convert.ToInt16(gt(stringDic["stime"])); //此处是字符串 但调用软件变量不用加双引号
    //MessageBox.Show(stimes.ToString()); //输出stime处理结果
    //从软件配置中读取起始时间,经过处理后交给下面进行时间戳减法处理得到起始时间戳
    int a = stimes*86400;
    long b = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
    long  groupStartTime = b-a;
    //MessageBox.Show(groupStartTime.ToString()); //输出起始时间戳
    //Application.OpenForms[0].Invoke((EventHandler)delegate
    //{
    //  Clipboard.SetText(groupStartTime.ToString());//写入剪贴板
    //});
    stringDic["stimes"] = groupStartTime.ToString();
}

//以上这段为软件中调用stringDic也是软件中的字符串变量

代码片段

------------------
string stime ="3";
if(string.IsNullOrEmpty(stime)) 
{
  MessageBox.Show("值为空:"+stime);
    int stimes =3;
  MessageBox.Show("修改值为:"+stimes);
}
else
{
  MessageBox.Show("不为空:"+stime);
        try
      {
        int stimes = int.Parse(stime);
  MessageBox.Show("是数字"+stimes);
      }
      catch (Exception)
      {
  MessageBox.Show("不是");
    int stimes =3;
  MessageBox.Show("修改值为:"+stimes);
      }
}
//先判断为空,空则设为3赋值给stimes,不空则判断是否是数字,不是则设为3赋值给stimes,是则赋值给stimes
___________以上是使用以下两段合并而成 达到以上功能
string str ="3";
if(string.IsNullOrEmpty(str)) 
{
  MessageBox.Show("值为空:"+str);
string nstr ="11";
  MessageBox.Show("修改值为:"+nstr);
}
else
{
  MessageBox.Show("不为空:"+str);
}

 string a = "3333";
      try
      {
        int b = int.Parse(a);
  MessageBox.Show("是数字"+b);
      }
      catch (Exception)
      {
  MessageBox.Show("不是");
      }

___________时间戳相减拆解

int a = stimes*86400;
long b = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
long  groupStartTime = b-a;
MessageBox.Show(groupStartTime);

我上一次用过的版本,但感觉有些问题 所以弃用了

//主要代码
 //封装函数用于等下转时间戳
 public string ConvertToUnix(string dateTime)
 {
 DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
 DateTime dtNow = DateTime.Parse(dateTime);
 TimeSpan toNow = dtNow.Subtract(dtStart);
 string timeStamp = toNow.Ticks.ToString();
 timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
 return timeStamp;
 } 

DateTime dt = DateTime.Now; //现在系统时间
MessageBox.Show(dt.AddHours(-48).ToString()); //现在-48小时 显示出来
string Unixtime = ConvertToUnix(dt.AddHours(-48).ToString()); //转换
MessageBox.Show(Unixtime); //时间戳结果 显示出来

修改修改我自己用 封装一下

public string ConvertToUnix(string dateTime)
 {
 DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
 //结果是 1970/1/1 8:00:00 起始日
 DateTime dtNow = DateTime.Parse(dateTime);
 //结果是 2022/10/14 3:48:01 这里的dateTime是传过来的参数,为了测试我用下面一句话代替
 //DateTime dtNow = DateTime.Parse(DateTime.Now.ToString());
 //DateTime.Parse() 方法,可以把string类型转换成DateTime类型返回

 TimeSpan toNow = dtNow.Subtract(dtStart);
  //结果是 19278.19:49:01
 string timeStamp = toNow.Ticks.ToString();
  //结果是 时间戳 带了7个0
 timeStamp = timeStamp.Substring(0, timeStamp.Length - 7);
 //结果是 负责砍掉时间戳尾部7个0
 return timeStamp;
//此段用于转换系统时间格式到Unix时间戳
 } 

public string getAddHours(int h)
 {
DateTime dt = DateTime.Now;
string zt= dt.AddHours(-h).ToString();
string t = ConvertToUnix(zt);
return t;
//主要用于自定义减去N个小时,然后利用上面的函数转为Unix时间戳并输出结果
}

//以下可以无视(因为主要用于在程序(某rpa程序)内调用并赋值给程序内的变量)
public void Run(Dictionary<string, string> stringDic, Dictionary<string, List<string>> listDic, Dictionary<string, int> intDic, Dictionary<string, Dictionary<string, string>> rowDic)
{
//MessageBox.Show(getAddHours(24)); 
stringDic["a"] = getAddHours(intDic["h"]);
//从软件内的变量h获取自定义的小时值,再从上面的函数获取转换后的结果,赋值给软件中的变量a
}

参考资料:

https://www.nhooo.com/note/qa07ov.html C#程序显示前一天
http://t.zoukankan.com/yuwentao-p-7232838.html C#中系统时间和UNIX时间戳互相转换
https://www.bilibili.com/read/cv13671114/ C#中unix与windows时间格式互转
https://blog.csdn.net/qq_37191147/article/details/59172491 C# DateTime和String类型转换
https://www.cnblogs.com/Pickuper/articles/2058880.html string格式的日期时间字符串转为DateTime类型”的方法
https://blog.csdn.net/weixin_44171249/article/details/123627173 C#当前时间加、减指定时间
https://blog.csdn.net/H_JH123/article/details/122255942 C# DateTime 日期加1天,减一天,加一月,减一月等方法
https://blog.csdn.net/Marccco/article/details/106128286 DateTime.Parse

附 细节的研究,以便不同场景修修改改:

DateTime.Now.ToString(); //显示当前时间 并转为字符串 以下都没转 但可以这样写去转字符串
DateTime dt = DateTime.Today.AddDays(-1); //按天 -1天 但只认天
DateTime dt = DateTime.Now.AddDays(-1);//按天 -1天 时分秒都不会忽略
DateTime dt = DateTime.Now.AddHours(-5);//按时 -5小时
DateTime dt = DateTime.Now.AddMinutes(-5);//按分 -5分
DateTime dt = DateTime.Now.AddSeconds(-5);//按秒 -5秒

以上浓缩的一句话也可以拆成两句话 依次类推
DateTime dt = DateTime.Now;
dt = dt.AddHours(-5);

MessageBox.Show(DateTime.Now.AddHours(-5).ToString()); //直接测试结果,显示5小时前
MessageBox.Show(DateTime.Now.AddHours(-5).ToShortDateString());  //直接测试结果,显示5小时前但只截取日期
MessageBox.Show(dt.AddHours(-5).ToString()); 
//直接测试结果,显示5小时前 但前面一行要有那句话 DateTime dt = DateTime.Now;

其他场景例子 如自带格式
 DateTime n = DateTime.Parse(DateTime.Now.AddMonths(-1).ToString("yyyy-MM-01"));
 //显示上个月1号
 DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); //昨天
 DateTime.Parse(DateTime.Now.AddDays(-7-(int)DateTime.Now.DayOfWeek).ToString("yyyy-MM-dd"));
 //上周日
 string s = n.ToString();
 MessageBox.Show(s); 

 ## 其他常见时间格式汇总

string y = DateTime.Now.ToString(); //会输出:2022/10/15 3:28:25
string y = DateTime.Now.ToLocalTime().ToString(); //会输出:2022/10/15 3:13:14
string y = DateTime.Now.ToShortDateString().ToString(); //会输出:2022/10/15
string y = DateTime.Now.Year.ToString(); //会输出:2022
string y = DateTime.Now.Month.ToString(); //会输出:10
string y = DateTime.Now.Day.ToString(); //会输出:15
string y = DateTime.Now.Hour.ToString(); //会输出:3
string y = DateTime.Now.Minute.ToString(); //会输出:34
string y = DateTime.Now.Second.ToString(); //会输出:54
string y = DateTime.Now.ToLongTimeString().ToString(); //会输出:3:14:22
string y = DateTime.Now.ToShortTimeString(); //会输出:22:00
string y = DateTime.Now.ToLongDateString().ToString(); //会输出:2022年10月15日

string y = DateTime.Now.AddYears(1).ToString(); //会输出:2023/10/15 4:11:08
string y = DateTime.Now.AddMonths(1).ToString(); //会输出:2022/11/15 4:11:20
string y = DateTime.Now.AddDays(1).ToString(); //会输出:2022/10/16 4:11:32
string y = DateTime.Now.AddHours(1).ToString(); //会输出:2022/10/15 5:11:46
string y = DateTime.Now.AddMinutes(1).ToString(); //会输出:2022/10/15 4:12:58
string y = DateTime.Now.AddSeconds(1).ToString(); //会输出:2022/10/15 4:12:10
string y = DateTime.Now.AddTicks(10000000).ToString(); //(纳秒)会输出:2022/10/15 4:08:36

string y = DateTime.Now.Equals("2022/10/15 4:12:10").ToString(); //会输出:False
//基本类型比较值:只要两个变量的值相等,即为true.

## 将全数字格式时间转为系统时间格式方法
string y = DateTime.Now.ToString("yyyyMMddHHmmss"); //注意此乃24小时格式 下面用不了
DateTime n = DateTime.ParseExact("20221014094521","yyyyMMddhhmmss",System.Globalization.CultureInfo.CurrentCulture);
//ParseExact方法(用来将自定义时间格式转换为系统标准时间) 注意第1个参数是12小时制,第二个自然是转换格式,第三个是线程 设置输出格式

  string s = n.ToString();
  MessageBox.Show(s); 

//---------------------------------//
  System.Globalization.CultureInfo

("20221014094521","yyyyMMddhhmmss",System.Globalization.CultureInfo.CurrentCulture);
("07-13 15:50:42","MM-dd HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);
前面是字符串后面是高速机器是什么格式字符串以便转换,区域类这两种属性处理后输出结果都一样(只是不知道不同国家如何)

//-------命名空间------区域性类---//
CultureInfo区域性类使同一个数据适应不同地区和文化
InvariantCulture是为了给机器看,避免无法被正常读取或者产生潜在bug(不同电脑的运行结果不一致 本地时间格式的问题),不管客户端运行在什么语言环境下,输出的时间格式都是统一的,保持输出结果都一致
InvariantCulture 属性既不表示非特定区域性,也不表示特定区域性。它表示第三种类型的区域性 它与英语语言关联,但不与任何国家/地区关联。几乎所有要求区域性的方法,都可以使用此属性
//---------------------------------//
.InvariantCulture(将结果统一)
.CurrentCulture (获取或设置当前线程的区域性,实现自动软件国际化)
.CurrentUICulture(获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源,常用开发多语言版本)

c# 时间戳转本地时间

/// <param name="TimeStamp">时间戳</param>
/// <param name="AccurateToMilliseconds">是否精确到毫秒</param>
/// <returns>返回一个日期时间</returns>
public static DateTime GetTime(long TimeStamp, bool AccurateToMilliseconds = false)
{
    System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
    if (AccurateToMilliseconds)
    {
        return startTime.AddTicks(TimeStamp * 10000);
    }
    else
    {
        return startTime.AddTicks(TimeStamp * 10000000);
    }
}

string timestr = "1645517610";
//string timestr = "1666644957411";
//如果是13位下面就要用true精准到毫秒 否则会出错
DateTime time = GetTime(long.Parse(timestr));
//DateTime time = GetTime(long.Parse(timestr),true);
string s = time.ToString();
MessageBox.Show(s); 

c# 取时间戳

/// <summary>
/// 取时间戳,高并发情况下会有重复。想要解决这问题请使用sleep线程睡眠1毫秒。
/// </summary>
/// <param name="AccurateToMilliseconds">精确到毫秒</param>
/// <returns>返回一个长整数时间戳</returns>
public static long GetTimeStamp(bool AccurateToMilliseconds = false)
{
  if (AccurateToMilliseconds)
  {
//当前时间计时周期数(636662920472315179)减去1970年01月01日计时周期数(621355968000000000)除去(删掉)后面4位计数(后四位计时单位小于毫秒)再取整(去小数点)。
//备注:DateTime.Now.ToUniversalTime不能缩写成DateTime.Now.Ticks,会有好几个小时的误差。
//621355968000000000计算方法 long ticks = (new DateTime(1970, 1, 1, 8, 0, 0)).ToUniversalTime().Ticks;
    return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000; 
  }
  else
  {
//上面是精确到毫秒,需要在最后除去(10000),这里只精确到秒,只要在10000后面加三个0即可(1秒等于1000毫米)。
    return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
  }
}

//string s = Convert.ToInt64(GetTimeStamp()).ToString(); 
string s = Convert.ToInt64(GetTimeStamp(true)).ToString(); //会输出:1666646283374
//负责调用方法GetTimeStamp(),由于结果是long类型需要转为字符串所以这么写,true是精确毫秒
MessageBox.Show(s); 

获取当前时间戳一句话

long t = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
//tool.lu的获取当前时间戳代码
string s = t.ToString();
MessageBox.Show(s);

时间戳相加减

1666648800//6点
1666645200//1小时前 -3600
1666641600//2小时前 -7200
1666562400//24小时前 -86400

long t = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
long i = t-3600;
string s = i.ToString();
MessageBox.Show(s);

//封装为函数
public string gettime(int h)
 {
//int a = h*3600; //这是小时,下面是按天
int a = h*86400;
long t = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
long  i = t-a;
return i.ToString();
}
c# 变量范围

由于我没用过c# ,至今还是比较恼火,我在判断内写了个赋值结果外面调用不了 你说烦不烦

同名的变量不能在相同的范围内声明两次,变量的范围是可以访问该变量的代码区域 变量对于循环来说是局部变量。循环结束后该变量就出作用域,不能再访问 在方法中定义的变量称为局部变量,在当前定义的方法中有效,方法调用被销毁,不能在其他类中调用

   class A
{
    string a;

public void ss()
{
    string b;
}

}

 static int j = 20;