【问题标题】:Reverse a month name to month number conversion将月份名称反转为月份编号转换
【发布时间】:2015-07-16 08:50:40
【问题描述】:

您好,我正在尝试做与此相反的事情,因为现在它从 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];

【问题讨论】:

  • 仅供参考months.indexOf(months[j]) === j
  • 不用循环,直接用数组:date[1]=['Sau', 'Vas', 'Kov', 'Bal', 'Geg', 'Bir','Lie', 'Rgp', 'Rgs', 'Spa', 'Lap', 'Grd'][ f.task_end_date.value.split("/")[1]-1]

标签: javascript string date


【解决方案1】:

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

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" 作为日期示例,您只需更改它即可。

【讨论】:

  • @RobG 不,他这样做了,但现在想将其返回到 2015/Sau/01,它是说 我不知道如何改回 2015/Sau/01
  • 顺便说一句,不需要 parseInt,- 运算符将字符串强制转换为数字,所以只需 months[dateArray[1] - 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
    })
}

【讨论】:

    【解决方案3】:

    你应该可以替换:

    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 将通过12 获取您的字符串01 并为您提供整数值,然后您减去一个以获得索引并查找等效的月份名称(我猜,虽然我不熟悉使用该特定语言)。

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

    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];
    

    它可能不会减少正在完成的实际工作,因为无论是显式还是隐式都必须完成从字符串到数字的转换(它甚至可能更慢,因为隐式转换必须处理十六进制值的可能性,但无论哪种方式都不太重要)。

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

    【讨论】:

    • 你是这个意思吗? for(var j=0;j&lt;months.length;j++){ if(date[1]==months[j]){ date[1] = months[parseInt(date[1],10)-1]; } } if(date[1]&lt;10){ date[1]='0'+date[1]; }
    • @McLaren,不,我的意思是摆脱整个搜索循环(如图所示的 forif 部分),只需放入那个单行。我会让它更明确。
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2020-07-25
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多