当对象来自Web API时如何避免将日期转换为字符串

时间:2018-08-17 08:29:14

标签: javascript typescript

我有一堂课

export class TestClass  {
        paymentDate: Date; 
}

当我尝试从某些服务器API获取此类的对象时,paymentDate字段以字符串形式出现,因此无法调用此字段.getDate()方法。 有没有可能避免这种转换?

UPD。 这是一个例子:
enter image description here

我还要注意,服务器返回的模型如下:

public class TestClass
    {
        public DateTime? PaymentDate { get; set; }
    }

2 个答案:

答案 0 :(得分:2)

如果您需要服务器端(看起来像c#)或客户端(javascript)方面的帮助,我会感到困惑

这两种方法之一就是编写一个自定义的setter或使用一个map函数将数据从Web api映射到该类。

我还没有测试这段代码,但是它的想法是要有一个解析器来解析日期。

服务器/ c#代码:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.io.IOException;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class MainActivity extends AppCompatActivity {
Retrofit retrofit;
ApiService apiService;

String item1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Log.i("result", getItemFromServer("5"));
    getItemFromServer("5");

    Log.i("msg", item1);

    String item2="item2";
    String item3="item3";

    String[] items={item1, item2, item3};
    ListAdapter adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
    ListView listView=(ListView)findViewById(R.id.listView);

    listView.setAdapter(adapter);

    listView.setOnItemClickListener(
            new AdapterView.OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int i, long id) {
                    String item=String.valueOf(parent.getItemAtPosition(i));
                    Toast.makeText(MainActivity.this, item, Toast.LENGTH_LONG).show();
                }
            }
    );
}

public void getItemFromServer(String id){
    retrofit=new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
    apiService=retrofit.create(ApiService.class);


    //GET
    Call<ResponseBody> comment=apiService.getByID(id);
    comment.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                item1=response.body().string();


            }catch (IOException e){
                Log.i("Test2", "failed");
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.i("Test", "get item from server failed");
        }
    });
}
}

我还没有测试过C#代码,但是它可以帮助您朝正确的方向前进。

在客户端(javascript /打字稿)上,您可以执行以下操作。

public class TestClass {
  private DateTime paymentdate
  public DateTime? PaymentDate {
    get { 
      return paymentdate
    }
    set {
      this.paymentdate = DateTime.ParseExact(value, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture)
    }
  }
}

这里解析是在设置器中进行的。因此,您避免在代码中检索值。

然后您将执行以下操作:

export class TestClass {
  private _paymentdate: Date;

  get paymentDate(): Date {
    return this._paymentDate
  }

  set paymentDate(value: string) {
    this._paymentDate = new Date(value);
  }
}

答案 1 :(得分:1)

您可以将响应包装在Date对象中

尝试

var responsePaymentDate = new Date(this.payment.paymentDate);

现在您将可以在此对象上调用get,set函数

希望这会有所帮助!