如何在C语言中确定在当前语言环境中哪一天是一周中的第一天

vddsk6oq  于 2023-01-04  发布在  其他
关注(0)|答案(3)|浏览(148)

如何确定哪一天是一周中的第一天在当前的语言环境在C。在俄罗斯星期一是第一天,但我的mac显示本地化日历与错误的第一天。所以我想知道我是否可以确定哪一天是第一天在当前的语言环境。谢谢。

anatoly@mb:/Users/anatoly$ cal
     Июля 2012
вс пн вт ср чт пт сб
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
vd2z7a6w

vd2z7a6w1#

使用glibc,您可以执行以下操作:

#define _GNU_SOURCE
#include <langinfo.h>

char get_first_weekday()
{
    return *nl_langinfo(_NL_TIME_FIRST_WEEKDAY);
}

记住先调用setlocale()。例如:

#include <stdio.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "");
    printf("%d\n", get_first_weekday());
    return 0;
}

这将在我的系统上返回2(这意味着星期一== DAY_2)。
只是一个提示:我不认为这是glibc的公共API。但是,这是locale工具捆绑它如何获得第一个工作日。cal使用类似的方法以及。
根据特定的用途,您可能也对_NL_TIME_FIRST_WORKDAY感兴趣。

46qrfjad

46qrfjad2#

在我的第一篇文章中我错了,ICU提供了一个C API。
因此,如果您可以接受对该库的依赖性,则可以使用以下代码片段轻松获取每周的第一天:

#include <stdio.h>

/* for calendar functions */
#include <unicode/ucal.h>
/* for u_cleanup() */
#include <unicode/uclean.h>
/* for uloc_getDefault() */
#include <unicode/uloc.h>

int main()
{
    /* it *has* to be pre-set */
    UErrorCode err = U_ZERO_ERROR;

    UCalendar* cal = ucal_open(
            0, -1, /* default timezone */
            uloc_getDefault(), /* default (current) locale */
            UCAL_DEFAULT, /* default calendar type */
            &err);

    if (!cal)
    {
        fprintf(stderr, "ICU error: %s\n", u_errorName(err));
        u_cleanup();
        return 1;
    }

    /* 1 for sunday, 2 for monday, etc. */
    printf("%d\n", ucal_getAttribute(cal, UCAL_FIRST_DAY_OF_WEEK));

    ucal_close(cal);
    u_cleanup();
    return 0;
}

然后将程序与icu-i18n pkg-config库链接。
啊,他们有相当广泛的example printing a calendar,如果你可能感兴趣。

vd2z7a6w

vd2z7a6w3#

显然在Mac上,你可以用途:

#include <ApplicationServices/ApplicationServices.h>
[..]
CFCalendarRef cal = CFCalendarCopyCurrent();  
long first_day = CFCalendarGetFirstWeekday(cal); // 1=Sunday, ..
CFRelease(cal);

来源:1(https://www.fltk.org/newsgroups.php?gfltk.coredev%20v:18854)。

相关问题