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-i18n次に、プログラムをpkg-config ライブラリとリンクします。

ああ、興味があるかもしれないなら、カレンダーを印刷する非常に広範な例があります。

于 2012-08-12T20:46:41.463 に答える