【发布时间】:2019-12-17 12:18:19
【问题描述】:
假设你有一个像这样的 json 响应字符串,并且你想按日期过滤。 您只想在特定日期之后显示记录。
[{btc=0, datetime=2018-01-30 12:16:11, eur=410.00, fee=0.00, usd=0, id=***, btc_usd=0.00, type=0}, {btc=0, eth_eur=692.81, datetime=2018-02-06 16:45:16, eur=-5.20, fee=0.02, usd=0, eth=0.00750000, id=***, type=2, order_id=***}, {btc=0, eth_eur=699, datetime=2018-02-05 17:04:25, eur=5.24, fee=0.02000000, usd=0, eth=-0.00750000, id=***, type=2, order_id=***}, {btc=0, eth_eur=562.1, datetime=2018-02-04 17:52:09, eur=-5.62, fee=0.02, usd=0, eth=0.01000000, id=***, type=2, order_id=***}, {btc=0, eth_eur=567.2, datetime=2018-02-06 20:24:07, eur=5.67, fee=0.02000000, usd=0, eth=-0.01000000, id=***, type=2, order_id=***}, {btc=0, datetime=2018-04-28 17:22:21, eur=0, fee=0.00000000, usd=0, eth=0.38811442, id=***, btc_usd=0.00, type=0}, {btc=0, eth_eur=563, datetime=2018-04-28 17:42:51, eur=218.50, fee=0.55000000, usd=0, eth=-0.38810000, id=***, type=2, order_id=***}, {btc=0, eth_eur=563, datetime=2018-04-28 17:47:52, eur=0.01, fee=0.01000000, usd=0, eth=-0.00001442, id=***, type=2, order_id=***}, {btc=0.01786568, btc_eur=5583.33, datetime=2018-08-14 12:01:13, eur=-99.75, fee=0.25, usd=0, id=***, type=2, order_id=***}]
类似情况
{btc_available=0.01489932, eth_reserved=0.00000000, eur_balance=1858.63, btcusd_fee=0.500, xrpeur_fee=0.500, btc_balance=0.01489932, xrp_withdrawal_fee=0.02000000, ethusd_fee=0.500, ltceur_fee=0.500, eth_balance=1.30423351, xrp_reserved=0.00000000, bchusd_fee=0.500, eur_reserved=0.00, bch_available=0.00000000, usd_available=0.18, xrp_available=328.75000000, xrpusd_fee=0.500, ltcbtc_fee=0.500, bcheur_fee=0.500, ltc_available=0.00000000, btc_reserved=0.00000000, ltc_withdrawal_fee=0.00100000, usd_reserved=0.00, btc_withdrawal_fee=0.00050000, eurusd_fee=0.500, xrp_balance=328.75000000, ltcusd_fee=0.500, ltc_balance=0.00000000, bch_reserved=0.00000000, bch_withdrawal_fee=0.00010000, eur_available=1858.63, ltc_reserved=0.00000000, bchbtc_fee=0.500, ethbtc_fee=0.500, etheur_fee=0.500, usd_balance=0.18, eth_available=1.30423351, btceur_fee=0.500, eth_withdrawal_fee=0.00100000, bch_balance=0.00000000, xrpbtc_fee=0.500}
我可以应用这个过滤器:
var keys = Object.keys(data);
var values = Object.keys(data).map(function(e){return data[e]});
var result = [];
var k;
for (k=0; k<keys.length; k++){
if (keys[k].slice(4, 13) == "available") {result.push([keys[k], values[k]]);}}
在这种情况下我无法申请。
所以我想我会申请for(){} 案例,但是有没有更合理和有效的方法来做到这一点?
var i;
for (i=0; i < data.length; i++) {
var d = data[i].datetime;
var bits = d.split(/\D/);
var date = new Date(bits[0], --bits[1], bits[2], bits[3], bits[4], bits[5]);
var date = (date.getTime().toFixed(0))/1000;
var date = date.toString();
if (date > lastDate) { //IFFONE
}
}
我什至考虑尝试从 json 字符串中提取每对键/值集并将它们呈现为数组,这样我就可以始终指向确切的位置(在这种情况下为日期时间),但我想有一个更直接的和一致的方式。你会怎么做?谢谢
ps:我忘了提到我们在 google apps script
编辑:应用@contributorpw 过滤器时的结果:
这个脚本
var data = {key: cred.key, signature: signature, nonce: nonce, sort: 'asc', limit: '10'};
var options = {'method' : 'post', 'muteHttpExceptions' : true, 'payload' : data};
var data = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/user_transactions/', options);
var data = JSON.parse(data.getContentText());
var values = data;
生成以下 json 数据集:
[{btc=0, datetime=2018-01-31 12:15:11, eur=410.00, fee=0.00, usd=0, id=50575781, btc_usd=0.00, type=0},
{btc=0, eth_eur=692.81, datetime=2018-02-04 16:49:16, eur=-5.20, fee=0.02, usd=0, eth=0.00750000, id=52010995, type=2, order_id=893820507},
{btc=0, eth_eur=699, datetime=2018-02-04 17:04:25, eur=5.24, fee=0.02000000, usd=0, eth=-0.00750000, id=52013332, type=2, order_id=893880089},
{btc=0, eth_eur=562.1, datetime=2018-02-05 17:52:09, eur=-5.62, fee=0.02, usd=0, eth=0.01000000, id=52338326, type=2, order_id=900603492},
{btc=0, eth_eur=567.2, datetime=2018-02-05 20:29:07, eur=5.67, fee=0.02000000, usd=0, eth=-0.01000000, id=52444353, type=2, order_id=900621129},
{btc=0, datetime=2018-04-30 17:29:21, eur=0, fee=0.00000000, usd=0, eth=0.38811442, id=64286847, btc_usd=0.00, type=0},
{btc=0, eth_eur=563, datetime=2018-04-30 17:41:51, eur=218.50, fee=0.55000000, usd=0, eth=-0.38810000, id=64287296, type=2, order_id=1424216470},
{btc=0, eth_eur=563, datetime=2018-04-30 17:41:52, eur=0.01, fee=0.01000000, usd=0, eth=-0.00001442, id=64287298, type=2, order_id=1424216470},
{btc=0, datetime=2018-05-24 13:45:15, eur=1300.00, fee=0.00, usd=0, id=66875907, btc_usd=0.00, type=0},
{btc=0.01786568, btc_eur=5583.33, datetime=2018-08-12 12:01:13, eur=-99.75, fee=0.25, usd=0, id=72064184, type=2, order_id=1986400456}]
为了简洁起见,它仅限于 10 条记录。
现在,假设我们要应用一个过滤器,它只返回日期 之后 2018, 4, 16 的数据。
以下是发生的事情:
[19-12-17 12:08:48:897 PST] [
{
"fee": "0.00",
"btc_usd": "0.00",
"datetime": "2018-05-24 13:45:15",
"usd": 0,
"btc": 0,
"type": "0",
"id": 66875907,
"eur": "1300.00"
},
{
"fee": "0.25",
"order_id": 1986400456,
"datetime": "2018-08-12 12:01:13",
"usd": 0,
"btc": "0.01786568",
"btc_eur": 5583.33,
"type": "2",
"id": 72064184,
"eur": "-99.75"
}
]
而你应该有更多的记录..我做错了什么?
这是完整的脚本:
/* nuova funzione nonce */
_generateNonce = function() {
var now = new Date().getTime();
if(now !== this.last)
this.nonceIncr = -1;
this.last = now;
this.nonceIncr++;
// add padding to nonce incr
var padding =
this.nonceIncr < 10 ? '000' :
this.nonceIncr < 100 ? '00' :
this.nonceIncr < 1000 ? '0' : '';
return now + padding + this.nonceIncr;
} //fine funzione nonce
var nonce = this._generateNonce();
var cred = {
id:'***',
key:'***',
secret:'***'};
var message = nonce + cred.id + cred.key;
var res = Utilities.computeHmacSha256Signature(message, cred.secret).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
var signature = res.toUpperCase();
var data = {key: cred.key, signature: signature, nonce: nonce, sort: 'asc', limit: '10'};
var options = {'method' : 'post', 'muteHttpExceptions' : true, 'payload' : data};
var data = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/user_transactions/', options);
var data = JSON.parse(data.getContentText());
var values = data;
var date = new Date(2018, 4, 16).toISOString().split(/t/i)[0];
var filteredData = values.filter(function(item) {
var d = item.datetime.split(/\s/)[0];
return d >= date;});
Logger.log(JSON.stringify(filteredData, null, ' '));
第二次编辑:问题出在哪里
问题只是我手动输入的日期和脚本生成的实际日期之间有一个月的偏移差异:所以这搞砸了所有结果,我不明白为什么。
也就是说,当手动输入时,这行命令
var date = new Date(2018, 3, 28).toISOString().split(/t/i)[0];
Logger.log(date);
产生这个结果:
[19-12-18 13:54:17:932 CET] 2018-04-27
另一方面,如果您直接从单元格(已经是日期格式)提供数据,则不会发生任何奇怪的事情:
var date = aDate.toISOString().split(/t/i)[0];
var filteredData = values.filter(function(item) {
var d = item.datetime.split(/\s/)[0];
return d >= date;
});
请read this参考。
我不得不感谢@contributorpw 和@Diego 的贡献。最后,我选择了来自contributorpw 的答案,因为我发现它在代码上更苗条和敏捷,但两者都很好且功能强大。谢谢
【问题讨论】:
-
@RobG 不幸的是,您链接的答案不相关。我的脚本的问题与
days missing有关,我认为这不仅仅是本地时间与UTC 的差异问题。至于第二个,我们不是在谈论comparing,而是在谈论filtering。无论如何,我都会查看您链接的答案,看看它们是否有帮助,即使我在发布之前做了一些研究。在我看来,仅仅调用一个副本太容易了。还是谢谢 -
由于时区偏移,
new Date(2018, 3, 28).toISOString()在您的时区(CET 或 UTC+1)中生成 2018-04-27 的日期。过滤需要比较,如return d >= date。 -
@RobG 您能否阐明您的评论,即使在必要时提供特定答案或链接到(明确)来源。我知道这很重要,但我不明白如何将您所说的应用于我的案子。谢谢
标签: javascript json date datetime google-apps-script