首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >date_time_period boost::locale::period::first_day_of_week(int v)示例

date_time_period boost::locale::period::first_day_of_week(int v)示例
EN

Stack Overflow用户
提问于 2014-04-02 05:42:33
回答 1查看 451关注 0票数 2

boost::locale文档中,它说:

date_time_period boost::locale::period::first_day_of_week(int v)内联 获取date_time_period for:一周中的第一天,常数,例如星期日在美国= 1,星期一在法国=2

返回date_time_period的函数可用于创建自定义boost::locale::date_time对象。

我尝试将std::locale设置为"en_US.UTF-8"创建一个,因此周的第一天默认为星期日,然后将其修改为星期一。下面是代码:

代码语言:javascript
复制
#include <iostream>
#include <boost/locale.hpp>

int main() {
  using namespace boost::locale;
  date_time_period_set s;
  generator gen;
  std::locale locale = gen("en_US.UTF-8");
  std::locale::global(locale);
  std::cout.imbue(locale);
  s.add(period::year(2000));
  s.add(period::month(6));
  s.add(period::day(5));
  s.add(period::hour(9));
  s.add(period::minute(0));
  s.add(period::second(0));
  s.add(period::first_day_of_week(2));// set the first day of week to Monday
  date_time now(s); // should be 2000-07-05 09:00:00, week starts from Monday
  std::cout << now << std::endl;
}

但是,运行程序会导致错误:

代码语言:javascript
复制
terminate called after throwing an instance of 'std::invalid_argument'
what():  Invalid date_time period type

错误来自它的ICU后端适配器:

代码语言:javascript
复制
  static UCalendarDateFields to_icu(period::marks::period_mark f)
  {
      using namespace period::marks;

      switch(f) {
      case era: return UCAL_ERA;
      case year: return UCAL_YEAR;
      case extended_year: return UCAL_EXTENDED_YEAR;
      case month: return UCAL_MONTH;
      case day: return UCAL_DATE;
      case day_of_year: return UCAL_DAY_OF_YEAR;
      case day_of_week: return UCAL_DAY_OF_WEEK;
      case day_of_week_in_month:  return UCAL_DAY_OF_WEEK_IN_MONTH;
      case day_of_week_local: return UCAL_DOW_LOCAL;
      case hour: return UCAL_HOUR_OF_DAY;
      case hour_12: return UCAL_HOUR;
      case am_pm: return UCAL_AM_PM;
      case minute: return UCAL_MINUTE;
      case second: return UCAL_SECOND;
      case week_of_year: return UCAL_WEEK_OF_YEAR;
      case week_of_month: return UCAL_WEEK_OF_MONTH;
      default:
          throw std::invalid_argument("Invalid date_time period type");
      }
  }

first_day_of_week是不可接受的。

所以问题是:

  1. 可以通过修改“一周中的第一天”来创建boost::locale::date_time对象吗?如果是真的,怎么做?
  2. 如何(或在何处)使用date_time_period boost::locale::period::first_day_of_week(int v)
EN

回答 1

Stack Overflow用户

发布于 2014-04-02 09:41:18

这似乎确实令人困惑。

预告片:

代码语言:javascript
复制
std::locale english = gen("en_US.UTF-8");
std::locale french  = gen("fr_FR.UTF-8");
std::cout.imbue(english); // this one doesn't matter
std::locale::global(french);

经过一些(广泛的)测试后,我发现date_time实例上的date_time值是:

  • 从构建时的全局区域设置。 地区::全局(英语);断言(1 == period::first_day_of_week(date_time();std::locale::global(法语);assert(2 == period::first_day_of_week(date_time();
  • 从构造期间传递的区域设置的或:集 断言(1 period::first_day_of_week(date_time(english)));断言(2 == period::first_day_of_week(date_time(french)));))
  • 或:设置自在复制构造过程中传递的date_time对象(忽略区域设置) date_time edt (英文)、fdt (法语)、assert(1 == period::first_day_of_week(Edt))、edt=date_time(法语)、assert(2 == period::first_day_of_week(Edt))、fdt=date_time(英语)、assert(1 == period::first_day_of_week);
  • (最重要的是:不能从其他源设置区域设置) { date_time_period_set dtps;dtps.add(周期:星期五();dtps.add(period::week_of_year(4));//无效果dtps.add(period::first_day_of_week(1));断言(2 == period::first_day_of_week( date_time (Dtps);}{date_time dt;// no效应: dt.set(period::first_day_of_week(),1);assert(2 == period::first_day_of_week(dt));}

不管这是否是个bug,我都要留给开发人员。你可以在boost邮件列表上询问。这确实是令人惊讶的,因为set接口的存在表明可以更改该属性。

实际上,第一个工作日的属性似乎不是,而是date_time的一个属性,而是locale的一个属性,并且似乎除了在构造/赋值时,date_time实例上的“注入”区域设置是不能更改的。

全面测试:住在Coliru

代码语言:javascript
复制
#include <boost/locale.hpp>
#include <iostream>

int main()
{
    using namespace boost::locale;
    generator gen;

    std::locale english = gen("en_US.UTF-8");
    std::locale french  = gen("fr_FR.UTF-8");
    std::cout.imbue(english); // this one doesn't matter
    std::locale::global(french);

    {
        std::locale::global(english);
        assert(1 == period::first_day_of_week(date_time()));

        std::locale::global(french);
        assert(2 == period::first_day_of_week(date_time()));
    }

    {
        assert(1 == period::first_day_of_week(date_time(english)));
        assert(2 == period::first_day_of_week(date_time(french)));
    }

    {
        date_time_period_set dtps;
        dtps.add(period::friday());
        dtps.add(period::week_of_year(4));
        // no effect
        dtps.add(period::first_day_of_week(1));

        assert(2 == period::first_day_of_week(date_time(dtps)));
    }

    {
        date_time dt;
        // no effect:
        dt.set(period::first_day_of_week(), 1);
        assert(2 == period::first_day_of_week(dt));
    }

    {
        // associated locale gets copied:
        date_time edt(english), fdt(french);
        assert(1 == period::first_day_of_week(edt));
        edt = date_time(french);
        assert(2 == period::first_day_of_week(edt));
        fdt = date_time(english);
        assert(1 == period::first_day_of_week(fdt));
    }

    std::cout << "All tests passed\n";
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22802466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档