我有一串数据需要使用javascript在前端进行转换,排序和显示。
数据采用此格式
yyyy-mm-dd hh:mm:ss事件标题在这里
Feed示例:
2011-04-19 00:00:00 event1标题在这里
2011-04-22 00:00:00 event2 title here
2011-05-25 00:00:00 event3 title here
2011-04-13 00:00:00 event4标题在这里
2011-12-13 00:00:00 event5 title here
需要转换日期格式,按日期显示,省略当前日期之前的事件(当前日期为04-21-2011):
所需清单的示例:
04-22-2011 event2 title here
05-25-2011 event3 title here
12-13-2011 event5 title here
提前致谢
答案 0 :(得分:0)
这是你让我们做的功课:P,给我一些时间我会把你搞砸了。
var dateRE = /^(\d{2})[\/\- ](\d{2})[\/\- ](\d{4})/;
function dmyOrdA(a, b){
a = a.replace(dateRE,"$3$2$1");
b = b.replace(dateRE,"$3$2$1");
if (a>b) return 1;
if (a <b) return -1;
return 0; }
function dmyOrdD(a, b){
a = a.replace(dateRE,"$3$2$1");
b = b.replace(dateRE,"$3$2$1");
if (a>b) return -1;
if (a <b) return 1;
return 0; }
function mdyOrdA(a, b){
a = a.replace(dateRE,"$3$1$2");
b = b.replace(dateRE,"$3$1$2");
if (a>b) return 1;
if (a <b) return -1;
return 0; }
function mdyOrdD(a, b){
a = a.replace(dateRE,"$3$1$2");
b = b.replace(dateRE,"$3$1$2");
if (a>b) return -1;
if (a <b) return 1;
return 0; }
dateArray = new Array('15/10/2000','28/05/1999',
'17/09/2005','06/12/2004','02/01/1998');
dateArray.sort( dmyOrdA );
document.write('Ascending : ' + dateArray + '<br />');
现在这只是一种排序日期的方法,使用这种逻辑来根据您的需要进行调整。 您可以做一些事情,可能为您的活动构建对象,以便在排序过程中将它们与日期联系起来。
答案 1 :(得分:0)
在这里制作一些插头,但它们可能有所帮助:
日期解析和操作可以由我的DateExtensions组件处理。我的ObCollectionOrdered组件可以轻松管理日期列表(排序)。
有两个例子都应该有所帮助。
根据具体情况,这些可能会使用大锤来杀死苍蝇,但它们会为您提供几乎所有复杂性,而不是问题。
答案 2 :(得分:0)
听起来你需要实现一个执行这些任务的功能:
解析输入:必须将字符串解析为具有“date”和“title”属性的对象列表。尝试将“YYYY-MM-DD”日期格式与正则表达式匹配,并使用其构造函数构建Date对象。
过滤数据:如果超过当前时间,则应拒绝对象,并按日期按递增顺序排序(从最旧到最新)。可以比较日期,并且可以使用JavaScript本地对列表进行排序。
格式化输出:对象应作为具有所需日期格式的字符串列表返回。尝试通过从月份,日期和年份获取者构建字符串来输出日期。
当然,您可以将库用于各种任务,例如日期处理,但使用纯JavaScript应该足够简单。例如:
<script language="javascript">
var parseFeed = function(str, now) {
var regex=/^(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d) (.*)$/
, input=str.split(/\n/).sort(), len=input.length
, output=[], now=now||new Date(), d, m;
for (i=0; i<len; i++) {
if (m = input[i].match(regex)) {
d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
if (d >= now) {
output.push([m[2], m[3], m[1]].join('-') + ' ' + m[7]);
}
}
}
return output; // An array of sorted, yet-to-come, formatted events.
};
var input = ""
+ "2011-02-19 00:00:00 event0 title here\n"
+ "2011-04-19 00:00:00 event1 title here\n"
+ "2011-04-22 00:00:00 event2 title here\n"
+ "2011-05-25 00:00:00 event3 title here\n"
+ "2011-04-13 00:00:00 event4 title here\n"
+ "2011-12-13 00:00:00 event5 title here\n";
var april12 = new Date(2011, 3, 21)
, output = parseFeed(input, april21);
</script>
答案 3 :(得分:0)
告诉你的程序员停止玩3D射击游戏并做好自己的工作^^
开玩笑说:
<script type="text/javascript">
var a, d, i, f, m, o, r, t, y;
a = [
"2011-04-19 00:00:00 event1 title here",
"2011-04-22 00:00:00 event2 title here",
"2011-05-25 00:00:00 event3 title here",
"2011-04-13 00:00:00 event4 title here",
"2011-12-13 00:00:00 event5 title here"
];
r = [];
t = [];
for (i = 0; i < a.length; i++) {
y = a[i].substr(0, 4);
m = a[i].substr(5, 2);
d = a[i].substr(8, 2);
t[i] = Date.UTC(
parseInt(y),
parseInt(m - 1, 10),
parseInt(d, 10),
parseInt(a[i].substr(11, 2), 10),
parseInt(a[i].substr(14, 2), 10),
parseInt(a[i].substr(17, 2), 10)
) / 1000;
r[i] = [t[i], a[i], m + "-" + d + "-" + y + a[i].substr(19)];
}
r.sort(
function(a, b) {
return a[0] - b[0];
}
);
f = Date.UTC(2011, 4 - 1, 21, 0, 0, 0) / 1000;
for (i in r) {
if (r[i][0] >= f)
document.write(r[i][2] + "<br />");
}
</script>
由于输入字符串的日期部分似乎遵循ISO8601格式,另一种解决方案是直接对整个字符串进行字面排序(可能因为在这种情况下,时间顺序与字母顺序相同),但是这是另一个故事,我不习惯。
答案 4 :(得分:0)
sorting dates ascending or descending
times = ["01-09-2013", "01-09-2013", "27-08-2013", "27-08-2013", "28-08-2013", "28-08-2013", "28-08-2013", "28-08-2013", "29-08-2013", "29-08-2013", "30-08-2013", "30-08-2013", "31-08-2013", "31-08-2013"]
function dmyOrdA(a,b){ return myDate(a) - myDate(b);}
function dmyOrdD(a,b){ return myDate(b) - myDate(a);}
function myDate(s){var a=s.split(/-|\//); return new Date(a[2],a[1]-1,a[0]);}
times.sort(dmyOrdA);
console.log(times)