时区偏移数组的自定义排序
Posted
技术标签:
【中文标题】时区偏移数组的自定义排序【英文标题】:custom sort for an array of timezone offsets 【发布时间】:2016-08-03 02:30:51 【问题描述】:我正在尝试对一组时区偏移量进行排序,如下所示:
["+03:00", "-11:00", "+05:00", "-04:00"]
这只是数组的一个子集。包括基于 GMT 的时区的所有偏移量。逻辑顺序是从-11.00
开始的GMT距离
所以最终正确的排序是:
["-11:00", "-04:00", "+03:00", "+05:00"]
我必须在这里使用Array.prototype.sort
,但我不完全确定在这里使用的最有效的自定义排序函数是什么。它会涉及将字符串分成两部分吗?例如:-|+
和offset
,例如:11, 4, 3, 5
,然后比较它们?有没有办法减少处理?
【问题讨论】:
您是否曾经需要处理“半小时区”? IE。达尔文/澳大利亚是+9:30
还是它们总是整数?
数组中的条目必须是字符串吗?它们可以是数字吗?
【参考方案1】:
排序函数应该是
function(a, b)
return parseFloat(a.replace(':', '.')) - parseFloat(b.replace(':', '.'));
基本上,将:
更改为.
并返回解析后的浮点数的差异
您还可以执行以下操作:
function(a, b)
return parseInt(a.replace(':', ''), 10) - parseInt(b.replace(':', ''), 10);
;
这会将字符串转换为+/-HHMM
,然后您可以将其解析为整数,并且仍然能够支持大量非整小时时区。虽然我不认为有那么多的表现要获得
【讨论】:
【参考方案2】:假设时区总是以:00
结尾,您可以简单地parseInt
它们:
["+03:00", "-11:00", "+05:00", "-04:00"].sort(
( a, b ) => (a, 10) > parseInt(b, 10)
);
parseInt
将向上读取一个字符串,直到找到看起来不像数字的字符。例如parseInt('1a')
返回1
。由于'-11:00'
的第一部分是一个有效数字('-11'
),parseInt 会正确读取它。
【讨论】:
非整点时区会失败以上是关于时区偏移数组的自定义排序的主要内容,如果未能解决你的问题,请参考以下文章