将区域设置更改为瑞典语 我在C++程序中使用SETLACLE有困难。我有一个字段,它是ftDateTime类型,我试图输入的数据是固定格式的

将区域设置更改为瑞典语 我在C++程序中使用SETLACLE有困难。我有一个字段,它是ftDateTime类型,我试图输入的数据是固定格式的,c++,locale,C++,Locale,当我手动将Windows设置中的语言环境更改为适合数据的语言环境时,程序运行良好。当我尝试使用代码更改区域设置时,它会引发一个异常,即日期和时间格式无效 void* ptr = setlocale(LC_ALL,"Swedish_Sweden"); 数据是一些不相关数据之前的日期和时间。瑞典格式是第一个匹配传入数据的格式。其中一项是: 2018-07-23 10:40:30此代码适用于我: #include <cstdio> #include <clocale> #in

当我手动将Windows设置中的语言环境更改为适合数据的语言环境时,程序运行良好。当我尝试使用代码更改区域设置时,它会引发一个异常,即日期和时间格式无效

void* ptr = setlocale(LC_ALL,"Swedish_Sweden");
数据是一些不相关数据之前的日期和时间。瑞典格式是第一个匹配传入数据的格式。其中一项是:


2018-07-23 10:40:30

此代码适用于我:

#include <cstdio>
#include <clocale>
#include <ctime>
#include <cwchar>

int main()
{
    std::setlocale(LC_ALL, "sv_SE.UTF-8");

    wchar_t str[100];
    std::time_t t = std::time(NULL);
    std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
}
要了解系统上的区域设置外观,请执行以下操作:

#include <iostream>
#include <clocale>

int main()
{
    std::setlocale(LC_ALL, "");
    std::cout << "LC_ALL: " << std::setlocale(LC_ALL, NULL) << std::endl;
    std::cout << "LC_CTYPE: " << std::setlocale(LC_CTYPE, NULL) << std::endl;
    return 0;
}

此代码适用于我:

#include <cstdio>
#include <clocale>
#include <ctime>
#include <cwchar>

int main()
{
    std::setlocale(LC_ALL, "sv_SE.UTF-8");

    wchar_t str[100];
    std::time_t t = std::time(NULL);
    std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
}
要了解系统上的区域设置外观,请执行以下操作:

#include <iostream>
#include <clocale>

int main()
{
    std::setlocale(LC_ALL, "");
    std::cout << "LC_ALL: " << std::setlocale(LC_ALL, NULL) << std::endl;
    std::cout << "LC_CTYPE: " << std::setlocale(LC_CTYPE, NULL) << std::endl;
    return 0;
}

我甚至不用setlocale解决了我的问题,因为它不起作用。我已经创建了ftDateTime字段和TFormatSettings字段,并用数据时间格式填充了这些字段。然后我就可以把它解析回本地日期格式

TDateTime D;
TFormatSettings fmt;
fmt.Create();
fmt.DateSeparator = '-';
fmt.ShortDateFormat = "y/m/d";
D = StrToDate(data,fmt);

return D.DateString();

我写道我正在使用RAD Studio,但主持人出于某种原因删除了它。

我甚至没有使用setlocale解决了我的问题,因为它不起作用。我已经创建了ftDateTime字段和TFormatSettings字段,并用数据时间格式填充了这些字段。然后我就可以把它解析回本地日期格式

TDateTime D;
TFormatSettings fmt;
fmt.Create();
fmt.DateSeparator = '-';
fmt.ShortDateFormat = "y/m/d";
D = StrToDate(data,fmt);

return D.DateString();

我写道我正在使用RAD Studio,但主持人出于某种原因将其删除。

您确定该地区的名称为Swedish_Swedish吗?当我使用sv_SE函数返回nullptr表示失败时,我认为它们的名称较短,比如sv_sew。用全名给我拿些指针。请用两个字符串都试一下。注意真正的问题,我要放的数据是固定格式的。我们看不到。你确定地点是瑞典吗?当我使用sv_SE函数返回nullptr表示失败时,我认为它们的名称较短,比如sv_sew。用全名给我拿些指针。请用两个字符串都试一下。注意真正的问题,我要放的数据是固定格式的。我们看不到它。进入std::setlocale的参数依赖于平台。在一个平台上,它可能是sv_SE.UTF_8,在另一个平台上,它可能是sv_SE,在另一个平台上,它可能是带破折号的sv FI,而不是下划线。和芬兰我不知道为什么。某些平台的支持可能不完整,导致setlocale或依赖于其中的操作行为不当。对我来说,这似乎是一个有问题的C++领域。使用long one返回指针,但仍然不起作用。@Wumpus在我的回答中尝试下面的代码,看看您的区域设置是如何定义的。好吧,不是直接定义的。我制作了硬编码的解决方案,可以将固定时间解析为另一个时间。@Wumpus您是否尝试过我的代码来获取您的区域设置字符串?它们看起来如何?进入std::setlocale的参数依赖于平台。在一个平台上,它可能是sv_SE.UTF_8,在另一个平台上,它可能是sv_SE,在另一个平台上,它可能是带破折号的sv FI,而不是下划线。和芬兰我不知道为什么。某些平台的支持可能不完整,导致setlocale或依赖于其中的操作行为不当。对我来说,这似乎是一个有问题的C++领域。使用long one返回指针,但仍然不起作用。@Wumpus在我的回答中尝试下面的代码,看看您的区域设置是如何定义的。好吧,不是直接定义的。我制作了硬编码的解决方案,可以将固定时间解析为另一个时间。@Wumpus您是否尝试过我的代码来获取您的区域设置字符串?它们看起来怎么样?