Javascript 将月份名称转换为月份编号

Javascript 将月份名称转换为月份编号,javascript,string,date,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(va

您好,我正在尝试做与此相反的事情,因为现在它从
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];
var date=f.task\u end\u date.value.split(“/”);
变量月数=['Sau'、'Vas'、'Kov'、'Bal'、'Geg'、'Bir'、'Lie'、'Rgp'、'Rgs'、'Spa'、'Lap'、'Grd'];

对于(var j=0;j您应该能够替换:

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];
}           
parseInt
将从字符串
01
12
得到整数值,然后减去1得到索引并查找等效的月份名称(我想,尽管我不熟悉该特定语言)

换言之,最终代码将是:

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];
它可能不会减少实际所做的工作,因为从字符串到数字的转换无论是显式还是隐式都必须完成(甚至可能会更慢,因为隐式转换必须处理十六进制值的可能性,但这两种方式都不太重要)


因此,如果您重视代码的简洁性,这当然是一个选项。我自己更喜欢显式版本,但您可能有其他优先级。

这里有一个简单的方法,只需拆分日期并根据路径号更改月份部分:

var月数=['Sau'、'Vas'、'Kov'、'Bal'、'Geg'、'Bir'、'Lie'、'Rgp'、'Rgs'、'Spa'、'Lap'、'Grd'];
var dateArray=“2015/01/01”。拆分(“/”);
log(日期数组);
var newDate=“”;

如果(dateArray[1]完全避免使用正则表达式:

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+个月)。indexOf(月)
(月)加上第三个捕获组(天)

返回只是调整正则表达式以在所有三个捕获组中使用
(\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
    })
}

你是说(var j=0;j@McLaren,不,我的意思是去掉整个搜索循环(如图所示的
for
if
部分),只需放入那一行。我会让它更明确。FYI
months.indexOf(months[j])==j
无需循环,只需使用数组:
date[1]=['Sau','Vas','Kov','Bal','Geg','Bir','Lie','Rgp','Rgs','Spa','Lap','Grd'][f.task\u end\u date.value.split(“/”[1]-1]
@RobG不,他这么做了,但现在想把它改回
2015/Sau/01
,意思是我不知道如何改回2015/Sau/01。顺便说一句,不需要parseInt,
-
操作符强制字符串为数字,所以只需
月[dateArray[1]
;-)
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
    })
}
// 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
    })
}