doeNET Framework 农历 ChineseLunisolarCalendar
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的更多相关文章
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- ChineseLunisolarCalendar 农历日期
#region 农历日期 static ChineseLunisolarCalendar cCalendar = new ChineseLunisolarCalendar(); /// <sum ...
- C# 阳历转农历
你妹的sb 原文 C#(ASP.NET)公历转农历的简单方法 Dot Net 平台,对全球化的支持做的非常好,不得不称赞一个 通常,将公历转为农历,是个非常烦的事情,需要整理闰年.闰月等的对照表. 在 ...
- 使用ChineseLunisolarCalendar 对象由年份获得生肖名,Datetime.now.tostring获得星期几
一:使用ChineseLunisolarCalendar 对象由年份获得生肖名,截图 二:代码 using System; using System.Collections.Generic; usin ...
- ASP.NET农历时间显示(两)
在拍摄的月球时前(http://blog.csdn.net/yysyangyangyangshan/article/details/6802950),只是没有进行封装使用起来须要手动改动. 本次进行简 ...
- ASP.NET如何显示农历时间
ASP.NET如何显示农历时间 CS部分代码如下: 代码如下: public string ChineseTimeNow = ""; public string ForignTi ...
- 由.Net类库提供的农历计算
由.Net类库提供的农历计算(C#农历) 2007-11-21 12:47:00 标签:.Net 类库 农历计算 C#农历 休闲 ...
- c# 公元转农历
void Main() { ,,); GetLunarDisplay(date).Dump(); } public List<string> GetLunarYearList() { va ...
- C#项目获取当前时间的农历时间
https://blog.csdn.net/cstester/article/details/7407044 using System.Globalization; class CnCanlendar ...
随机推荐
- Js前台页面搜索
$("#filter").on("keyup",function(){$(".aimed_list").hide().filter(&quo ...
- Oracle学习笔记—归档模式
什么是归档模式 Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组.当一个联机重做 ...
- KGX滚动分页源码
源码描述: 本工具采用Jquery框架,通过jquery调用ashx获取并输出数据,示例中采用测试数据,可以自行扩展为图片等等 当下流行的分页方式,鼠标滚动下拉条会自动展示下一页信息,类似瀑布流的效果 ...
- cut命令学习
cut最基本的用法: -f 列号:提取第几列 -d 分隔符:按照指定分隔符分割列(默认是制表符tab) 测试用例:(制表符)
- 1.7 使用电脑测试MC20的发送带中文的短信功能
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- python中的逻辑操作符
python中主要有三个逻辑操作符,分别是:and.or.not. and:且,所有人为真才为真. or:或,一个为正就是真. not:非,取反. >>> print(3>2 ...
- 【转】jQuery插件之ajaxFileUpload
转自:http://www.cnblogs.com/kissdodog/archive/2012/12/15/2819025.html 说在前头,本文出自上面的作者,只是以前存的一些网址不见了,怕以后 ...
- Python之 Django 初级
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Ubuntu系统常用操作命令
1.基本命令: sudo 提升用户权限为root用户 ls 显示文件内容 cd 进入指定路径,后接路径参数 如cd /进入根目录 cd -进入用户目录 cd ..返回上一级目录 mv xx.txt x ...
- 【leetcode刷题笔记】Palindrome Partitioning II
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...