如何存储程序启动时的日期时间,避免Console.ReadLine刷新相关变量?
问题:如何存储程序启动时的时间而非当前时间?
我编写了多个涉及日期/时间的程序(包括使用Random.Next()),但一直存在一个问题:每次调用Console.ReadLine()(或其他会使代码暂停后恢复的语句)时,所有基于日期时间设置或修改的变量都会被刷新。请问是否可以存储程序启动时的时间而非当前时间?我使用的是在线编辑器dotnetfiddle.net。
示例代码:
using System; namespace timeTest { public class Program { public static void Main() { Random random = new Random();//Random is based off of time, which updates Console.WriteLine("Randomizer: " + random.Next(1,11));//Prints random number long time = DateTime.Now.Ticks; Console.WriteLine("Time in ticks: "+time);//Prints time in ticks int hr = DateTime.Now.Hour; int min = DateTime.Now.Minute; int sec = DateTime.Now.Second; Console.WriteLine("Military time: "+hr+":"+min+":"+sec);//Prints time on the clock int sec2 = sec*2;//Stores value in a different variable times two Console.WriteLine("2x the current second: "+sec2);//Prints twice the second while (true) {Console.ReadLine();}//Every time Console.ReadLine is called, it changes again } } }
解决方案
1. 固定存储程序启动时间
在程序启动的最早期,将当前时间存入一个静态只读变量,后续所有需要使用时间的逻辑都基于这个变量,不再重复调用DateTime.Now。
2. 复用Random实例
Random默认以当前时间为种子,短时间内重复创建实例会导致随机序列重复。因此只需在程序启动时创建一次Random实例,后续复用即可。
修改后的代码:
using System; namespace timeTest { public class Program { // 存储程序启动时的时间,仅初始化一次 private static readonly DateTime _startTime = DateTime.Now; // 全局复用的Random实例,仅初始化一次 private static readonly Random _random = new Random(); public static void Main() { Console.WriteLine("Randomizer: " + _random.Next(1,11)); long time = _startTime.Ticks; Console.WriteLine("Time in ticks: " + time); int hr = _startTime.Hour; int min = _startTime.Minute; int sec = _startTime.Second; Console.WriteLine("Military time: " + hr + ":" + min + ":" + sec); int sec2 = sec*2; Console.WriteLine("2x the current second: " + sec2); while (true) { Console.ReadLine(); } // 暂停恢复后,变量值不会再变化 } } }
关键修改说明
_startTime作为类级静态变量,在程序加载时就完成初始化,后续始终保持程序启动时的时间值,不会随系统时间更新。_random同样作为静态变量仅初始化一次,避免了因重复创建实例导致的随机数重复问题。
内容的提问来源于stack exchange,提问作者Razzon22
相关产品推荐
相关产品推荐

