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. javafx tableview 设置多选

    id_resultTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

  2. Python3.6全栈开发实例[004]

    4.计算传入函数的字符串中, 数字.字母.空格以及其他内容的个数,并返回结果. s1 = 'wan%$#(gwdwq\nwdhuaiww3 w02041718' def func1(s1): dic ...

  3. Codeforces 240F. TorCoder 线段树

    线段树统计和维护某一区间内的字母个数.. . . F. TorCoder time limit per test 3 seconds memory limit per test 256 megabyt ...

  4. (转)fiddler使用简介--其一

    原文地址:https://www.cnblogs.com/miantest/p/7289694.html Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行 ...

  5. Linux 使用pppd和ppp程序进行3G/4G拨号

    试验环境:Linux marsboard 3.4.90 #9 SMP PREEMPT Thu Mar 3 18:28:43 CST 2016 armv7l armv7l armv7l GNU/Linu ...

  6. 1.8 使用电脑测试MC20的GPRS功能

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

  7. Summaries On Java

    @1:== 和 equals(): ==用于比较引用和比较基本数据类型时具有不同的功能: 比较基本数据类型:如果两个值相同,则结果为true. 比较引用:如果引用指向内存中的同一对象,结果为true( ...

  8. 曾经跳过的坑------replace、替换斜杠反斜杠、时间格式化处理

    JAVA 中: 坑一: replace没有用对象进行接收.直接使用 dateStr.replaceAll("\\/", "-"); 是不行的,至少得加上 &qu ...

  9. rails 下载 send_file

    def download send_file File.join(Rails.root, "public", @doc.link), :filename => @title+ ...

  10. asp.net 下载图片

    public class DownLoad : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Res ...