2

如何确定 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
4

3 回答 3

7

使用 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

于 2012-07-10T09:34:33.220 回答
1

我在第一篇文章中错了,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-i18npkg-config 库链接。

啊,如果你有兴趣的话,他们有一个相当广泛的打印日历的例子。

于 2012-08-12T20:46:41.463 回答
0

显然在 Mac 上你可以使用:

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

资料来源:[1]

于 2019-07-27T00:29:24.997 回答