【问题标题】:How to determine upcoming months relative to a given month in any calendar?如何确定相对于任何日历中给定月份的即将到来的月份?
【发布时间】:2022-01-26 00:38:42
【问题描述】:

如何根据我选择的日历找出与给定月份相关的未来月份?

意思是我选择了公历,给定的月份是九月,会出现以下月份的列表:

[九月、十月、十一月、十二月]

如果选择回历并且当前月份是:Dhu al-Qa'dah,则会显示剩余月份的列表,它们是:

[Dhul Qi'dah, Dhul Hijjah]

我使用以下参考来制作代码,但它不起作用

System.Globalization.CultureInfo(DateLangCulture, false).DateTimeFormat

【问题讨论】:

  • 我已经做出了回答。如果您不介意,可以点击“✔”将我的回复标记为已接受答案。它还将帮助其他人解决类似的问题。

标签: c# datetime calendar globalization


【解决方案1】:

在 .NET Framework 中,月份名称基于文化。如果我清楚地理解您的问题,您想选择一些“日历”并列出其中的几个月。我认为这种方法存在问题,因为不同的文化可能使用相同的日历,而这些不同的文化可能有不同的月份名称。

例如,我们以GregorianCalendar 为例,如果你想列出基于英语的月份名称,你可以清楚地使用像InvariantCulture 这样的文化,你会得到JanuaryFebruary , March 等。但另一方面,土耳其文化 (tr-TR) 也使用 GregorianCalendar 作为日历,但它的月份名称类似于 OcakŞubatMart 等。这意味着,即使您为日历选择“正确的”CultureInfo,您也可能遇到语言问题。我希望你能理解我的担心。一个日历月可能有不同的语言,因为它们属于文化。

如果您真的想根据日历获取这些信息,您可以创建一个 CultureInfo,它使用选定的 Calendar 并将其 MonthNames 属性列为从当前月份开始的字符串数组。

例如;对于GregorianCalendar,您可以使用InvariantCulture 的月份名称;

CultureInfo.InvariantCulture.DateTimeFormat.MonthNames

一月 二月 行进 四月 可能 六月 七月 八月 九月 十月 十一月 十二月

对于HijriCalendar,您可以使用ar-SA 文化(它使用UmAlQuraCalendar,在我看来与HijriCalendar 非常接近)哪个月份的名称是;

(new CultureInfo("ar-SA")).DateTimeFormat.MonthNames

推荐 回复 ربيع الأول ربيع الآخر جمادى الأولى جمادى الآخرة ㄧㄧ شعبان 关注 شوال ذو القعدة 呸呸呸呸

它们可以翻译成英文;

可以得到当前月份的编号为;

var currentMonthNo = Datetime.Now.Month;

然后你可以从它的前一个索引(因为数组开始索引 0)开始迭代到数组的末尾(注意,有些日历有 13 个月,这就是为什么 12月文化数组的第13个元素是一个空字符串。)

【讨论】:

  • 假设客户端机器有一个回历,我只想使用公历,我只想在下拉列表中提取带有月份编号的月份名称
  • @ebrahemb 然后您必须首先检查客户端使用哪个日历,然后创建一个与 that 日历对应的 CultureInfo 并迭代 MonthNames 属性开始使用当前月份编号,您始终可以使用 Datetime.Now.Month 获取公历。你试过编码吗?听起来您只要求理论上的实现,而不是实际实现它。
【解决方案2】:

仅补充 Soner Gönül 的答案。

如果要根据当前系统日历获取公历月份,可以参考以下代码:

namespace ConsoleApp1 {
    internal class Program {
        static void Main (string[] args) {
            //CultureInfo culture = CultureInfo.GetCultureInfo("en-US");
            //CultureInfo culture = CultureInfo.GetCultureInfo("ar-SA");
            CultureInfo culture = CultureInfo.GetCultureInfo("fr");
            List<KeyValuePair<int,string>> months = new List<KeyValuePair<int,string>>();
            for (int i = getCurMonth(); i <= 12; i++)
                {
                months.Add(new KeyValuePair<int, string>(i, DateTime.Parse(DateTime.Now.Year.ToString() + "-" + i + "-1").ToString("MMMM", culture)));
                }
            foreach (KeyValuePair<int, string> month in months)
                {
                Console.WriteLine(month.Value);
                }
            Console.ReadLine();
            }
        static int getCurMonth () {
            return DateTime.Now.Month;
            }
        }
    }

要获取特定的国家日历,系统必须安装相应的字符集。

可以看下面的例子:

zh-我们

CultureInfo culture = CultureInfo.GetCultureInfo("en-US");

输出:

f

CultureInfo culture = CultureInfo.GetCultureInfo("fr")

输出:

如果您对我的代码有任何疑问,请在下方评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多