将月份名称反转为月份号码转换

时间:2015-07-16 08:50:40

标签: javascript string date

您好我试图对此做相反的事情,因为现在它从2015/Sau/01更改为2015/01/01我不知道如何更改回2015/Sau/01 ,我怎么能用这个脚本做这个,因为我需要保持语言环境语言,请帮助我。

var date = f.task_end_date.value.split("/");
var months = ['Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir','Lie', 'Rgp', 'Rgs', 'Spa', 'Lap', 'Grd'];
for(var j=0;j<months.length;j++){
    if(date[1]==months[j]){
         date[1]=months.indexOf(months[j])+1;
     }                      
} 
if(date[1]<10){
    date[1]='0'+date[1];
}                        
var formattedDate = date[0]+date[1]+date[2];

3 个答案:

答案 0 :(得分:3)

这是一种简单的方法,只需根据路径编号分割日期并更改月份部分:

var months = ['Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir', 'Lie', 'Rgp', 'Rgs', 'Spa', 'Lap', 'Grd'];

var dateArray = "2015/01/01".split("/");
console.log(dateArray);
var newDate="";

if (dateArray[1] <= 12) {
  newDate = dateArray[0] + "/" + months[dateArray[1] - 1] + "/" + dateArray[2];
  alert(newDate);
}

我使用"2015/01/01"作为日期示例,您只需要更改它。

答案 1 :(得分:2)

完全避免正则表达式:

var months = ['Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir',
                'Lie', 'Rgp', 'Rgs', 'Spa', 'Lap', 'Grd']
function transformMonth (str, toText) {
    str = str.split('/')
    str[1] = toText ? months[str[1] - 1] : 1 + months.indexOf(str[i])
    return str
}

console.log(transformMonth('2015/Sau/01', false)) // --> '2015/01/01'
console.log(transformMonth('2015/01/01', true))   // --> '2015/Sau/01'

我通常不喜欢正则表达式,但是这个很好地完成了工作:

/            # start regex
(\d+)        # capture as many digits as possible
\/           # until hitting a forward slash
(\w+)        # capture as many characters as possible
\/           # until a forward slash
(\d+)        # capture the remaining numbers
/            # end regex

然后,您所要做的就是返回第一个捕获组(年份)加上(1 + months.indexOf(month)(月)加上第三个捕获组(日)。

var months = ['Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir',
                'Lie', 'Rgp', 'Rgs', 'Spa', 'Lap', 'Grd']

// this transforms '2015/Sau/01 to '2015/01/01'
function toNumberMonth (str) {
    return str.replace(/(\d+)\/(\w+)\/(\d+)/, function (date, year, month, day) {
        return year + '/' + (1 + months.indexOf(month)) + '/' + day
    })
}

回头只是调整正则表达式以在所有三个捕获组中使用(\d+)

// this transforms '2015/01/01' to '2015/Sau/01'
function toTextMonth (str) {
    return str.replace(/(\d+)\/(\d+)\/(\d+)/, function (date, year, month, day) {
        return year + '/' + months[month-1] + '/' + day
    })
}

答案 2 :(得分:1)

你应该能够取代:

for(var j=0;j<months.length;j++){
    if(date[1]==months[j]){
         date[1]=months.indexOf(months[j])+1;
     }                      
} 
if(date[1]<10){
    date[1]='0'+date[1];
}           

使用:

date[1] = months[parseInt(date[1],10)-1];

parseInt会将您的字符串01通过12并为您提供整数值,然后您减去一个以获取索引并查找等效的月份名称(我猜,虽然我不熟悉那种特定的语言。)

换句话说,最终的代码是:

var date = f.task_end_date.value.split("/");
var months = ['Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir','Lie', 'Rgp', 'Rgs', 'Spa', 'Lap', 'Grd'];
date[1] = months[parseInt(date[1],10)-1];
var formattedDate = date[0] + date[1] + date[2];

如果您愿意,也可以避免使用parseInt(),因为当您减去一个字符串时,Javascript会将字符串视为一个数字(通过ToNumber操作):

date[1] = months[date[1]-1];

它可能不会减少实际的工作,因为无论是显式的还是隐式的,都必须完成从字符串到数字的转换(由于隐式转换必须处理十六进制值的可能性,但无论如何都不太重要。)

因此,如果您重视代码的简洁性,那肯定是一种选择。我自己更喜欢显式版本,但您可能还有其他优先事项。