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 ...
随机推荐
- CentOS 7.4 防火墙&网卡设置
防火墙 查看防火墙状态 临时关闭防火墙 (关闭的是当前正在运行的防火墙,重启时还是会自启) 彻底关闭防火墙 (开机不会再自启) 开启防火墙 查看防火墙状态 网卡 查看网卡状态
- Android系统移植与调试之------->如何修改Android系统默认显示【开发者选项】并默认打开【USB调试】和【未知来源】开关
今天有个用户对[设置]有个特殊的要求,即: 1.开机的时候默认显示[开发者选项]并打开[USB调试]开关 ([Developer options]-->[USB debugging]) 2 ...
- Selenium chrome配置不加载图片
from selenium import webdriver chrome_options = webdriver.ChromeOptions() prefs = {"profile.man ...
- su: warning: cannot change directory to : Permission denied ;-bash: bash_profile: Permission denied
一.查看主目录权限对不对 1:问题描述 [root@ser6-52 ~]# su - mongodb su: warning: cannot change directory to /home/mon ...
- 20170421 F110 常见问题
F110常見問題以及處理方式 1. Vendor中沒有與F110中相同的Payment method 解決辦法: 在Vendor主檔中維護Payment method 2. 結報被Block 解決辦法 ...
- Python之面向对象进阶------反射(Day26)
一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...
- centos 6.5 设置屏幕保护
设置屏幕保护:System -> Preferences -> Screensaver.如果需要取消屏幕保护的锁定功能,将Lock screen when screensaver is a ...
- yii2-lock-form 也许这就是你想要的,阻止表单多次提交
是不是被用户的行为所困扰? 一个表单用户点击提交按钮了N次,这也导致了数据提交了N次. 为了此受到了测试的欺辱,受到了老板的批评? 不用怕,它就是来拯救你的. 第一步:打开命令行,敲入 compose ...
- ArchiMate进行业务架构建模的参考
业务服务视图 业务渠道视图 业务服务实现视图 业务角色协作视图 业务流程协作视图 业务流程视图 业务对象视图 产品化业务服务视图 分层视图 除了以上内容,在TOGAF中完整的推荐视图是 在ArchiM ...
- MQ,互联网架构解耦神器
一个架构常识:当调用方需要关心执行结果,通常使用RPC调用. ret = PassportService::userAuth(name, pass); switch(ret){ case(YES) ...