C:\Program Files (x86)\MSBuild\14.0\Bin\csc.exe test.cs

# test.cs

using System;
using System.Diagnostics;
using System.Globalization;
using System.IO; class Program
{
private static readonly ConsoleColor DefaultForegroundColor = Console.ForegroundColor;
private static readonly int DefaultPreSaleDays = ;
private static readonly string WebSite = "http://www.12306.cn"; private static int Main(params string[] args)
{
var preSaleDays = ;
if (args.Length > )
{
if (!int.TryParse(args[], out preSaleDays))
{
ShowHelpAndExit(); //第一个参数错误
}
else if (args.Length > )
{
DateTime argsDate; //出行日期
if (args[].Trim().Equals("now", StringComparison.OrdinalIgnoreCase))
{
argsDate = DateTime.Now.AddDays(preSaleDays - ); //出行日期为now的话,计算出今天可预订的出行日期
}
else if (!DateTime.TryParse(args[], out argsDate))
{
ShowHelpAndExit(); //第二个参数错误
}
Console.WriteLine($"\n * 火车票预售期为:{preSaleDays}天\n\n出行日期:{FormatDate(argsDate)}");
OutputBookingDay(preSaleDays, argsDate); //输出预售日期
var paused = true;
if (args.Length > )
{
if (args[].Trim().Equals("nopause", StringComparison.OrdinalIgnoreCase))
{
paused = false; //第三个参数为 nopause 则不暂停直接退出,用于配合命令提示符
}
}
if (paused)
{
Console.Write("\n按任意键退出...");
Console.ReadKey(true);
}
Environment.Exit(); //正常退出
}
}
else
{
Console.WriteLine("计算从哪天起应该购买预售火车票"); //未带参数,输出标题
Console.WriteLine();
}
if (preSaleDays <= )
{
Console.Write($"火车票预售期(缺省为{DefaultPreSaleDays}天):");
var input = Console.ReadLine()?.Trim(); //手动输入预售期
InputToExit(input);
if (!int.TryParse(input, out preSaleDays) || preSaleDays <= )
{
preSaleDays = DefaultPreSaleDays; //输入错误,预售期设置为缺省天数
ConsoleCursorRelativeLine(-); //光标移动到上一行行首。
var point = ConsoleCursorGetCurrentPosition();
if (point != null)
{
ConsoleCursorFillLines(point.Value.Top, point.Value.Top, ' '); //清除光标所在行的显示字符(用空格填充)
Console.Write($"火车票预售期(缺省为{DefaultPreSaleDays}天):{preSaleDays}\n");
}
}
}
Console.WriteLine($"\n * 火车票预售期为:{preSaleDays}天");
Console.WriteLine($" * 今天可以预定 {FormatDate(DateTime.Now.AddDays(preSaleDays - 1))} 的火车票");
Console.WriteLine(" * 输入 exit 可退出程序,输入 g 打开12306订票网站\n");
while (true)
{
Console.Write("出行日期:"); //输入出行日期
var input = Console.ReadLine()?.Trim();
InputToExit(input); //若输入exit则退出
if (input != null && input.Equals("g", StringComparison.OrdinalIgnoreCase))
{
Process.Start(WebSite); //输入g打开12306网站
Console.WriteLine($"正在打开 {WebSite}");
}
else
{
DateTime dest;
if (DateTime.TryParse(input, out dest))
{
ConsoleCursorRelativeLine(-);
var point = ConsoleCursorGetCurrentPosition();
if (point != null)
{
ConsoleCursorFillLines(point.Value.Top, point.Value.Top, ' '); //清除前一行显示字符
Console.WriteLine($"出行日期:{FormatDate(dest)}"); //更新输出日期
}
OutputBookingDay(preSaleDays, dest);
}
else
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("输入错误"); //显示输出错误
Console.ForegroundColor = DefaultForegroundColor;
ConsoleCursorRelativeLine(-); //光标向上移动3行
var point = ConsoleCursorGetCurrentPosition();
if (point != null)
{
ConsoleCursorFillLines(point.Value.Top, point.Value.Top + , ' ');
}
}
}
Console.WriteLine();
}
} static void InputToExit(string input)
{
if (input.Equals("exit", StringComparison.OrdinalIgnoreCase))
{
Environment.Exit(); //用户退出
}
} static void ShowHelp()
{
//帮助提示
var appname = Path.GetFileName(Environment.GetCommandLineArgs()[]);
Console.WriteLine(" * 参数格式:");
Console.WriteLine($" {appname} <火车票预售期>");
Console.WriteLine($" {appname} <火车票预售期> <出行日期> [nopause]");
Console.WriteLine($" {appname} <火车票预售期> now [nopause]");
Console.WriteLine($"\n * 例子:预售期{DefaultPreSaleDays}天,查看今天可以预定哪天火车票");
Console.WriteLine($" {appname} 60 now");
Console.WriteLine("\n * 批处理:");
Console.WriteLine($" {appname} 60 now nopause|Find \"出行日期:\"");
Console.WriteLine();
} static void ShowHelpAndExit(int exitcode)
{
ShowHelp(); //显示帮助提示然后按任意键退出
Console.Write("按任意键退出...");
Console.ReadKey(true);
Environment.Exit(exitcode); //返回错误码(errorlevel)
} static string FormatDate(DateTime date)
{
ConsoleColor? cc;
return FormatDate(date, out cc); //格式化日期
} private static readonly string[] DayOfWeek = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
private static readonly string[] DayOfToday = { "前天", "昨天", "今天", "明天", "后天" }; private static string FormatDate(DateTime date, out ConsoleColor? consoleColor)
{
var d = (date.Date - DateTime.Now.Date).Days;
var tip = d>=- && d<= ? $"({DayOfToday[d+2]})" : $"({DayOfWeek[(int) date.DayOfWeek]})";
consoleColor = d >= ? ConsoleColor.Green : ConsoleColor.Yellow;
var chinaCalendarString = ConvertToChineseLunisolarCalendar(date);
return $"{date:yyyy-M-d}{tip}{chinaCalendarString}";
} private static void OutputBookingDay(int days, DateTime destDate)
{
var date = destDate.AddDays(-days + );
ConsoleColor? cc;
var formattedDest = FormatDate(date, out cc);
Console.ForegroundColor = DefaultForegroundColor;
Console.Write("预售日期:"); //用缺省前景色显示“预售日期:”这几个字
if (cc.HasValue)
{
Console.ForegroundColor = cc.Value; //更换前景色
}
Console.WriteLine(formattedDest); //按格式输出预售日期
Console.ForegroundColor = DefaultForegroundColor; //还原缺省前景色
} private static void ConsoleCursorRelativeLine(int rows)
{
//将ConsoleCursor操作封装成方法,加入try语句,防止在非控制台下输出造成异常,下同
try
{
var t = Console.CursorTop + rows; //相对行号
Console.SetCursorPosition(, t); //移动光标到相对行
}
catch
{
// ignored
}
} private static void ConsoleCursorFillLines(int startLine, int endLine, char @char)
{
var d = endLine - startLine + ;
if (d > )
{
var consoleCursorGetCurrentPosition = ConsoleCursorGetCurrentPosition();
if (consoleCursorGetCurrentPosition != null)
{
var point = consoleCursorGetCurrentPosition.Value;
Console.SetCursorPosition(, startLine); //光标移动到起始行
Console.Write(new string(@char, Console.BufferWidth*d)); //用字符填满指定行数(d)
Console.SetCursorPosition(point.Left, point.Top); //返回光标原来的位置
}
}
} private static Point? ConsoleCursorGetCurrentPosition()
{
try
{
return new Point(Console.CursorLeft, Console.CursorTop); //返回光标位置
}
catch
{
// ignored
}
return null; //失败
} private struct Point
{
public readonly int Left;
public readonly int Top; public Point(int left, int top)
{
Left = left;
Top = top;
}
} private static readonly ChineseLunisolarCalendar ChinaCalendar = new ChineseLunisolarCalendar();
private static readonly string[] M1 = { "正月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "腊月" };
private static readonly string[] D1 = { "初", "十", "廿" };
private static readonly string[] D2 = { "一", "二", "三", "四", "五", "六", "七", "八", "九" };
private static readonly string[] D3 = { "初十", "二十", "三十" }; private static string CcDay(int d)
{
var dd = d%;
return dd == ? $"{D3[d/10-1]}" : $"{D1[d/10]}{D2[dd-1]}";
} private static string CcMonth(int y, int m)
{
var leapMonth = ; if (ChinaCalendar.IsLeapYear(y))
{
for (int i = ; i <= m; i++)
{
if (ChinaCalendar.IsLeapMonth(y, i))
{
leapMonth = i;
break;
}
} if (m == leapMonth)
{
return $"闰{M1[m - 2]}";
} if (leapMonth > )
{
return $"{M1[m - 2]}";
}
} return $"{M1[m - 1]}";
} private static string ConvertToChineseLunisolarCalendar(DateTime date)
{
if (date > ChinaCalendar.MaxSupportedDateTime || date < ChinaCalendar.MinSupportedDateTime)
{
return "";
}
var y = ChinaCalendar.GetYear(date);
var m = ChinaCalendar.GetMonth(date); // 1~13
var d = ChinaCalendar.GetDayOfMonth(date); // 1~31
return $"{CcMonth(y, m)}{CcDay(d)}";
}
}

doeNET Framework 农历 ChineseLunisolarCalendar的更多相关文章

  1. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  2. ChineseLunisolarCalendar 农历日期

    #region 农历日期 static ChineseLunisolarCalendar cCalendar = new ChineseLunisolarCalendar(); /// <sum ...

  3. C# 阳历转农历

    你妹的sb 原文 C#(ASP.NET)公历转农历的简单方法 Dot Net 平台,对全球化的支持做的非常好,不得不称赞一个 通常,将公历转为农历,是个非常烦的事情,需要整理闰年.闰月等的对照表. 在 ...

  4. 使用ChineseLunisolarCalendar 对象由年份获得生肖名,Datetime.now.tostring获得星期几

    一:使用ChineseLunisolarCalendar 对象由年份获得生肖名,截图 二:代码 using System; using System.Collections.Generic; usin ...

  5. ASP.NET农历时间显示(两)

    在拍摄的月球时前(http://blog.csdn.net/yysyangyangyangshan/article/details/6802950),只是没有进行封装使用起来须要手动改动. 本次进行简 ...

  6. ASP.NET如何显示农历时间

    ASP.NET如何显示农历时间 CS部分代码如下: 代码如下: public string ChineseTimeNow = "";  public string ForignTi ...

  7. 由.Net类库提供的农历计算

             由.Net类库提供的农历计算(C#农历)                 2007-11-21 12:47:00 标签:.Net 类库 农历计算 C#农历 休闲            ...

  8. c# 公元转农历

    void Main() { ,,); GetLunarDisplay(date).Dump(); } public List<string> GetLunarYearList() { va ...

  9. C#项目获取当前时间的农历时间

    https://blog.csdn.net/cstester/article/details/7407044 using System.Globalization; class CnCanlendar ...

随机推荐

  1. 从B 树、B+ 树、B* 树谈到R 树(转)

      作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由weedge完成,R 树部分由Fra ...

  2. (4.9)SQL Server如何校验备份文件

    译 SQL Server如何校验备份文件 转自:https://blog.csdn.net/tjvictor/article/details/5261666 RESTORE VERIFYONLY与 c ...

  3. 3.2 使用STC89C52控制MC20发送短信

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  4. try catch 事务不会滚

    在spring机制中,在配置事务后,如果采用try catch 捕获异常后,因为异常已经被捕获,所以事务不会滚,从而产生许多脏数据.解决办法: 1.在catch中抛出异常,(throw new Run ...

  5. docker helloworld

    阿里云镜像: docker官网 docker官方安装文档 配置阿里云镜像后,重启服务,以及检测服务是否正确启动 docker version.info.--help linux帮助命令man ls 镜 ...

  6. js文件操作

    IE下 1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码代码如下: Var fso=new ActiveXObject(Scripting.FileSys ...

  7. java多线程笔记

    一,线程的状态 1,新建状态:新创建了一个线程对象 2,就绪状态:线程创建对象后,线程调用star()的方法,等待获取CPU的使用权. 3,运行状态:获取了cpu的使用权,执行程序代码 4,阻塞状态: ...

  8. CentOS7,将文本模式改成图形界面模式

    在以前通过vi /etc/inittab,将3修改成5.但是在centOS7之后将修改的办法换掉了,执行systemctl set-default graphical.target.根据提示进行一步一 ...

  9. 纯代码编写qt登录界面(转)

    1. 新建Qt Widgets Application,项目名称为login1,在类信息页面保持类名和基类为MainWindow和QMainWindow不变,取消选择创建界面选项,如下图所示.     ...

  10. Emgu在引用openCV时提示:无法加载 DLL“opencv_core2410”: 找不到指定的模块。

    在引用开源代码openCV时发现了如下问题: 无法加载 DLL“opencv_core2410”: 找不到指定的模块. (异常来自 HRESULT:0x8007007E). 解决方法如下: 将Emgu ...