2017-07-31 59 views
0

我有不同类型的日期格式,如:你将如何处理不同格式的日期?

  • 8月27日至28日663 CE

  • 1945年8月22日5月19日

  • 1945年5月4日 - 1945年8月22日

  • 5/4/1945

  • 2-7-1232

  • 1020年3月4日

  • 1/3/1 (year 1)

  • 09/08/0 (year 0)

注意他们都是不同的格式,不同的顺序,一些有2个月,一些只有一个,我试图用moment js没有结果,我也尝试使用date js,但没有运气。

我试图做一些分裂:

dates.push({ 
    Time : [] 
}); 

function doSelect(text) { 
    return $wikiDOM.find(".infobox th").filter(function() { 
    return $(this).text() === text; 
    }); 
} 
dateText = doSelect("Date").siblings('td').text().split(/\s+/g); 
for(var i = 0; i < dateText.length; i++) { 
    d += dateText[i] + ' '; 
} 
dates[0].Time.push(d); 

但结果是:

"Time": [ 
      "27 - 28 August 663 CE ", 

最终什么,我需要自动生成是:

<ul class="Days"> 
    <li>27</li> 
    <li>28</li> 
</ul> 

<ul class="Months"> 
    <li>August</li> 
</ul> 

<ul class="Year"> 
    <li>663</li> 
</ul> 

而且还认为一种方法来处理CEADBC

为了实现这个目标,我想用一个理想的方式是一个多维数组:

time.push({ 
    Day : [], 
    Month : [], 
    Year : [], 
    Prefix : [] 
}); 

大概检查max 2 numbers for days,查个月对像January, February, March..字符串列表,然后在今年分钟3 numbers to max 4 numbers然后处理prefix with some conditionals。但是,year 2 or 1怎么样?或者如果日期是02/9/1975?或者分开dash,他们会是一种新的格式。我认为这里的逻辑有点不同,但考虑到它们都是不同的格式,如何将这些日期分成多维数组?

+0

这是一个字符串解析问题,该日期库赢得除了可能验证最终字符串并且不是一个小问题之外,可能不会有帮助 – charlietfl

+0

@charlietfl是的,事实上他们没有帮助。我想分割字符串,最后再检查更新的问题,并附加一些额外的想法。 –

+0

可能需要为您从数据中获取的已知格式(以及每个数据的解析器)构建大量的正则表达式,并且当您遇到不匹配的新存储的正则表达式时,您可以为其编写一个新的正则表达式 – charlietfl

回答

0

我将更新这个答案越来越多,而我将建立新的解析器。随意贡献。

所以对于这些格式,我会做:

27 - 28 August 663 CE 
22 August 1945 19 May 
May 4 1945 – August 22 1945 
5-10 February 1720 

JS

months = new Set(["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]); 
for(var i = 0; i < dateText.length; i++) { 
    d += dateText[i] + ' '; 
} 
var words = d.replace("–", " ").replace("-", " ").replace(",", " ").replace("/", " ").split(' '); 
words = $.grep(words, function(n, i){ 
    return (n !== "" && n != null); 
}); 
var array = words; 
var newArray = array.filter(function(v){return v!==''}); 
for (const word of newArray) { 
if (months.has(word)) { 
    spacetime[0].Time.months.push(word); 
} else if (+word < 32) { 
    spacetime[0].Time.days.push(+word); 
} else if (+word < 2200) { 
    spacetime[0].Time.years.push(+word); 
} else if (/\w+/.test(word)) { 
    spacetime[0].Time.suffixes.push(word); 
} 

JSON例如:

 "Time": { 
      "days": [ 
       22 
      ], 
      "months": [ 
       "August" 
      ], 
      "years": [ 
       1945 
      ], 
      "suffixes": [ 
       "10:25", 
       "(UTC+1)" 
      ]