Javascript 显示日期和月份,根据区域设置不显示年份

Javascript 显示日期和月份,根据区域设置不显示年份,javascript,date,localization,formatting,momentjs,Javascript,Date,Localization,Formatting,Momentjs,有没有更好的方法从一个日期(包括合适的位置分隔符)中只获取日期和月份 我有一个解决方案,首先得到分隔符: function getDateSep() { var temp = moment().format('L'); var locale = moment().locale; var datesep = temp.substring(5, 6); return datesep; } 然后建立如下日期: var sep = function getDateSep()

有没有更好的方法从一个日期(包括合适的位置分隔符)中只获取日期和月份

我有一个解决方案,首先得到分隔符:

 function getDateSep() {
   var temp = moment().format('L');
   var locale = moment().locale;
   var datesep = temp.substring(5, 6);
   return datesep;
}
然后建立如下日期:

var sep = function getDateSep()
var date = date.format('D' + sep + 'M'+ sep)
是否有一种动态构建整个日期的解决方案

我想要达到的结果是: 31.01(dd.mm) 2001年1月31日(日/月) 01.31(月日) 01/31(mm/dd)等

您是否考虑过使用而不是
monentjs

它需要一个JS日期对象和选项来输出 您指定格式的区域设置日期

例如:

var date = new Date();
var options = { day: 'numeric', month: 'short' };

console.log(date.toLocaleDateString('en-GB', options));
// outputs: Feb 24

var numeric = { day: 'numeric', month: 'numeric' };

console.log(date.toLocaleDateString('en-GB', numeric));
// outputs: 24/02
正如评论中所指出的,值得确保您的目标平台支持上述带有
选项的
toLocaleDateString
方法。例如,Android webview目前不支持这种方法,详情如下

您是否考虑过使用monentjs而不是
monentjs

它需要一个JS日期对象和选项来输出 您指定格式的区域设置日期

例如:

var date = new Date();
var options = { day: 'numeric', month: 'short' };

console.log(date.toLocaleDateString('en-GB', options));
// outputs: Feb 24

var numeric = { day: 'numeric', month: 'numeric' };

console.log(date.toLocaleDateString('en-GB', numeric));
// outputs: 24/02

正如评论中所指出的,值得确保您的目标平台支持上述带有
选项的
toLocaleDateString
方法。例如,Android webview目前不支持这种方法,如链接问题中所述:一种方法是获取本地化的longDateFormat,然后使用正则表达式删除年份部分

Daniel T.在评论中强调,该解决方案在
en CA
等地区不起作用,因此我将提供一个更新的解决方案,该解决方案将考虑从年份开始的一些其他地区

可能还有一些其他区域设置没有使用
/.YYYY/
/YYYY./
RegExp进行转换,如果您需要支持每个区域设置,您可以使用特殊条件将其作为目标,正如我在下面的代码段中为
ar ly
所做的那样

下面的代码示例显示了在各种语言环境中可能的输出:

函数changeLang(值){
地点(值);
//获取区域设置数据
var localeData=moment.localeData();
var format=localeData.longDateFormat('L');
//管理定制案例
如果(值==“ar ly”){
格式='D/\u200FM';
}
//如果(值===…)可能的其他情况
//检查区域设置格式和地带年份
if(格式匹配(/.yyy/g)){
格式=格式.替换(/.yyy/,'');
}
if(format.match(/YYYY./g)){
格式=格式。替换(/YYYY./,“”);
}
var res=力矩().格式(格式);
$(“#结果”).html(res);
}

EN
恩卡(加拿大)
行政主任(世界语)
判定元件
信息技术
胡(匈牙利语)
ja(日语)
lv(拉脱维亚语)
FR
中弘香港-中文(香港)
阿拉伯文(利比亚语)

如链接问题中所述:您需要的一种方法是获取本地化的longDateFormat,然后使用正则表达式删除年份部分

Daniel T.在评论中强调,该解决方案在
en CA
等地区不起作用,因此我将提供一个更新的解决方案,该解决方案将考虑从年份开始的一些其他地区

可能还有一些其他区域设置没有使用
/.YYYY/
/YYYY./
RegExp进行转换,如果您需要支持每个区域设置,您可以使用特殊条件将其作为目标,正如我在下面的代码段中为
ar ly
所做的那样

下面的代码示例显示了在各种语言环境中可能的输出:

函数changeLang(值){
地点(值);
//获取区域设置数据
var localeData=moment.localeData();
var format=localeData.longDateFormat('L');
//管理定制案例
如果(值==“ar ly”){
格式='D/\u200FM';
}
//如果(值===…)可能的其他情况
//检查区域设置格式和地带年份
if(格式匹配(/.yyy/g)){
格式=格式.替换(/.yyy/,'');
}
if(format.match(/YYYY./g)){
格式=格式。替换(/YYYY./,“”);
}
var res=力矩().格式(格式);
$(“#结果”).html(res);
}

EN
恩卡(加拿大)
行政主任(世界语)
判定元件
信息技术
胡(匈牙利语)
ja(日语)
lv(拉脱维亚语)
FR
中弘香港-中文(香港)
阿拉伯文(利比亚语)

虽然接受的答案是通过操作Moment提供的预定义本地化格式来完成的,但Moment还有另一种方式可以让您扩展其本地化配置,这在某些情况下可能更适合

如果在npm模块中打开一个本地化文件,如
/moment/locale/de.js
, 您将看到一个本地化日期格式列表,如下所示:

longDateFormat : {
    LT: 'HH:mm',
    LTS: 'HH:mm:ss',
    L : 'DD.MM.YYYY',
    LL : 'D. MMMM YYYY',
    LLL : 'D. MMMM YYYY HH:mm',
    LLLL : 'dddd, D. MMMM YYYY HH:mm'
},
这将为您提供一个很好的起点,以及如何为您支持的每个区域设置进行本地化的线索。例如,德语将日期放在月份之前,而在英语中,月份在日期之前

然后,通过在初始化时扩展配置,可以复制并调整所需的格式:

//更新后使用每种语言的自定义日期格式配置
//加载区域设置时(此处LMD是一种自定义格式)
updateScale('en',{longDateFormat:{LMD:'mmmmmd'}});
updateScale('de',{longDateFormat:{LMD:'D.MMMM'}});
//对您支持的其他地区重复以上操作,并使用文化正确的格式
函数changeLang(值){
地点(值);
//检索存储的自定义格式
var format=moment.localeData().longDateFormat('LMD');
var res=力矩().格式(格式);
$(“#结果”).html(res);
}

EN
判定元件

虽然接受的答案是通过操作Moment提供的预定义本地化格式来完成的,但Moment还有另一种方式可以让您扩展其本地化配置,这在某些情况下可能更适合

如果在npm模块中打开一个本地化文件,如
/moment/locale/de.js
, 你会看到一个l的列表