【问题标题】:How to determine which day is the first in week in current locale in C如何确定哪一天是C中当前语言环境中的第一天
【发布时间】:2012-07-10 08:59:18
【问题描述】:

如何在 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

【问题讨论】:

  • 看起来 cal 本地化只是翻译日期和月份,而不是一周的第一天是星期一、星期日还是星期六。
  • 看起来是这样,但你确定,没有办法确定哪一天是 ANCI C 中的第一天。我发布了 cal outpu 作为示例。
  • 正如注释:cal 第一天显示错误,因为它使用了 MacOS 上似乎没有提供的 _NL_TIME_FIRST_WEEKDAY 方法。在 glibc 系统上,cal 将在星期一开始。
  • 据我所知,mac 根本不附带 glibc。它使用另一个 libc(不知道是哪个),并且标题中根本没有 _NL_TIME_FIRST_WEEKDAY,所以我最终得到了 #if !defined(GLIBC) return 1; #else return *nl_langinfo(_NL_TIME_FIRST_WEEKDAY); #endif

标签: c date time locale


【解决方案1】:

使用 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 感兴趣。

【讨论】:

  • 我一拿到 May 笔记本电脑就试一试。谢谢!
  • 貌似mac os没有glibc,那么在Mac OS有什么办法可以做到吗?
  • 库在那里,但不支持_NL_TIME_FIRST_WEEKDAY :(
  • 恐怕我不知道 C 中 MacOS 的任何解决方案。您可以尝试Boost.Locale,但它是 C++。它似乎也适用于 C++ 的 ICU
【解决方案2】:

我的第一篇文章错了,ICU 提供了一个 C API。

因此,如果您可以接受对该库的依赖,您可以使用以下 sn-p 以可移植的方式获得一周的第一天:

#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

【讨论】:

  • 这是一种“测试任务”,所以使用什么库并不重要。然而,我在谷歌中找不到它真的很奇怪。您使用图书馆还是刚刚找到它?
  • 好吧,我知道它是因为它是通过 boost 拉入我的系统的。然而,我刚刚在另一篇文章中注意到 ICU 实际上也有一个 C API(不仅仅是 C++ 的 API)。
【解决方案3】:

显然你可以在 Mac 上使用:

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

来源: [1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多